C语言基础---指针

 

C语言基础---指针

学习C语言,指针是必须重视的,本人觉得,正是因为指针才使得C语言如此的强大与妙不可言(当然还有其丰富的数据类型与运算符)。

指针的作用,说的大白话一点就是:有了指针,就能找到你。

就好比全球定位系统,只要你在地球上,把精确的地址给我,我就能定位到你。

 

那么什么是指针变量呢?就是存放地址值的变量,该变量只能存放内存地址值,定义如下:

类型标识符   *指针变量名;

 

先看如下代码:

int a=88888;

int *p;

p=&a;

printf("a的内容为:\n,*p");

我先模拟个场景来解释上面的代码:假设a是一堆宝藏,藏在ffc0(变量a的内存地址)这个位置,你现在要去寻宝,手上有张藏宝图p,清楚的告诉了你宝藏a的藏身之处是ffc0,那样你就可以轻而易举的找到宝藏a了。就那么简单,说白了,指针p就像这张藏宝图,上面清晰记录着宝藏a的地址。

内存图剖析如下:

 

上述代码的解释:

int a=88888;    //定义整形变量a,此时系统分配内存给变量a,并赋值88888

int *p;              //定义指针变量p

p=&a;              //将变量a的地址存放到指针变量p中

printf("a的内容为:\n,*p");     //输出*p的内容,即a的值

注:

int *p; 

printf("a的内容为:\n,*p");

两个*代表不同的含义:

int *p; 这行代码中的“*”只是一个说明符,用来说明p不是其他变量,而是指针变量,将来只能把地址赋值给p,相当于是一个象征含义,不能省略,但也不属于变量名的一部分。而“*”前面的类型标识符(int)表示只能将该类型(int)的变量地址赋值给定义的指针变量p

printf("a的内容为:\n,*p");这行代码中的“*”不是说明符,而是指针运算符,其作用是:通过存放在指针变量p的地址找到该地址下的变量,在上述代码中,相当于a

 

 

指针的初始化:

1>先定义后初始化

int a=3;     //定义整形变量a,初始值为3

int *p;        //定义指针变量p,将来存放int类型变量的地址

p=&a;       //将int类型的变量a的地址赋值给指针变量p,则可以说,指针变量p指向变量a

 

2>定义的同时初始化

int a=3;     //定义整形变量a,初始值为3

int *p=&a;     //定义指针变量p,将int类型的变量a的地址赋值给指针变量p,则可以说,指针变量p指向变量a

 

注:在指针变量没有指向确定地址之前,不要对它所指的内容赋值。下面的写法是错误的

int *p;

*p=5;

试想一下,上面代码只是定义了一个指针变量p,并没有存放明确的地址,意味着p可能指向任何不受程序控制的内存,然后往该不可知的内存赋值一个数据,想想都恐怖啊。

  

默认情况下,一个函数只能有一个返回值,利用指针可以模拟实现“无数个返回值”,相当于无数个返回值。

例:写一个函数,同时计算两个整数的和、差、积、商、模

 #include <stdio.h>

// 计算两个数的和、差、积、商、模

void heChaJiShangMo(int num1, int num2, int *he, int *cha, int * ji, int *shang, int *yu)

{

    *he = num1 + num2;

    *cha = num1 - num2;

    *ji = num1 * num2;

    *shang = num1 / num2;

    *yu = num1 % num2;

}

 int main(int argc, const char * argv[])

{

     int num1 = 15, num2 = 3;

    int he, cha, ji, shang, mo;

    // 通过地址传递,在自定义的函数内部修改外部的值,间接达到一个函数多个返回值

    heChaJiShangMo(num1, num2, &he, &cha, &ji, &shang, &mo);

    printf("%d%d\n",num1, num2);

    printf("==%d,\n==%d,\n==%d,\n==%d,\n==%d\n",he, cha, ji, shang, mo);

    return 0;

} 

 

初略了解了下指针,可能有些人会问:指针变量在内存中占多少字节的存储空间呢?既然指针变量可以指向各种不同类型的数据,其占用的空间会不会有所不同?

其实搞清楚指针的本质,就不会有这个疑问了。指针变量存放的是一个地址,内存中所有的地址肯定是一样的格式,因此,不管是指向什么类型变量的指针,其本质还是存放一个地址,既然都是一个地址,那么大家肯定都一样大,因此在同一种编译环境下,一个指针变量占用的内存空间是固定的,并不会因所指向变量的类型而不同。

 

                                        16位编译器        32位编译器        64位编译器

指针变量占的字节数               2                        4                         8

 

 

 

 

 

 

posted on 2015-04-08 09:52  我是一匹小黑马  阅读(208)  评论(0编辑  收藏  举报