-
什么是指针
在c语言中,相信指针是非常让大家头疼的部分,总感觉他像是幽灵一样,飘忽不定,这来自于他的灵活性。但如果把指针搞清楚,相信你一定会爱上它的。
指针的本质是一个变量,就如每一个数字变量都有一个无符号性的对应变量,c语言中的每一个数据类型又有其对应的变量。
int a; unsigned int b; int x=a; int* y=&b;
那么,指针里面既然是变量,那么它装的是什么呢?
答案是地址,我们通过指针的初始化过程可以发现,我们通过“&”这个取地址符,将”b”变量的地址放入了“y”中。就好像是,小明要找到小芳,他不需要记住小芳所有的信息,只需要小芳的微信号就可以,地址在这里,就是起着“微信号”的作用。
事实上,指针就是地址,两个名词说的完全就是一回事,他们唯一的区别只在于翻译的不同。
那么下一个问题,“*”在这里是什么意思呢?
前文说了,地址也就是“&b”充当了微信号的意思,但小明如果想要找到小芳,光看着微信号是远远不够的他还需要十分关键的一步,那就是,“打电话”。“*”这个符号就是代表着“打电话”这个动作,他的名字叫做“解引用”。
int *y=&b; printf("b=%d",*y);
让我们再来看看这个式子,它表达了什么呢?
首先,我们将“b”的地址复制给了“y”,这里的“*”表示的是定义指针变量,而非解引用。
之后,我们使用“printf()”函数将“*y”打印到屏幕上。这里的“*”的作用则是解引用,即直接读取y地址所指向的值,即:变量b的值。
-
Swap函数:
下面让我们看指针的一个具体应用
#include<stdio.h> void Swap(int *x,int *y){ int temp=*x; *x=*y; *y=temp; } int main(){ int a=10; int b=20; printf("a=%d,b=%d\n",a,b); Swap(&a,&b); printf("a=%d,b=%d\n",a,b); return 0; }
运行结果如下:
在这个案例中,我们定义了"a"、"b"两个变量,并定义了一个使用指针类型变量的函数(即使用实参变量的函数)。
之后通过Swap函数,将两个变量的地址传递给参数列表的指针。在函数内,通过解引用直接操作变量"a","b"。所以最终的结果是a与b交换了变量。
下面是未使用解引用的结果:
#include<stdio.h> void Swap(int *x,int *y){ int temp=x; x=y; y=temp; } int main(){ int a=10; int b=20; printf("a=%d,b=%d\n",a,b); Swap(&a,&b); printf("a=%d,b=%d\n",a,b); return 0; }
运行结果如下:
可见并未交换,其只是交换了x和y中存放的a和b的地址。
-
总结:
-
指针就是地址,是一种数据类型,对应的变量使用对应的指针类型。
-
指针内存放的是变量的地址,可以通过解引用来直接操作对应变量。
-
对于局部变量,指针可以帮助我们跨函数操作变量本身。
-