《 C P r i m e r P l u s 》 《C Primer Plus》 《CPrimerPlus》第九章“函数”部分专门讲了指针,清晰透彻,现在加入我的一点理解,进行一下总结。
ptr = &pooh;//把ptr指向pooh,或者说把pooh的地址赋值给ptr
val = *ptr;/* 找出ptr指向的值,*给出存储在指针指向的地址上的值,
*ptr相当于获得储存在该地址的值 */
int* pi;//pi指向int类型
char* pc;//pc指向char类型
float* pf, * pg;//pf,pg指向float类型
解释一下下面这个:
int* pi = &bah;
相当于*pi的值是bah,是一个int类型的变量,
pi是一个指针,它的值是bah这个int类型变量的地址,
pi本身不是整数类型,它指向的值是int类型的变量
这个定义的意思是定义一个指针p(int* 意味着p是指针),它的值是bah的地址
这里的* 是声明变量的意思,与单独的 *p不同,
后者(*p)的 * 是解引用,与&(取地址符)相对应。
下面有一个非常非常经典的例子。
因为函数作为黑盒,只能传递单一的值(return),所以交换x,y的值是不能用单独的赋值函数做的,需要用到指针:
#include<stdio.h>
void interchange(int* u, int* v);
int main()
{
int x = 5, y = 10;
printf("Originally x = %d and y = %d\n", x, y);
interchange(&x, &y);
printf("Now x = %d and y = %d\n", x, y);
return 0;
}
void interchange(int* u, int* v)
{
int temp;
temp = *u;
*u = *v;
*v = temp;
}
这里的interchange函数传递的不是x和y的值(不是5和10),而是它们的地址(00000022D02FF594和00000022D02FF5B4),进入函数后的解引用符(*)将temp赋值为00000022D02FF594这个地址上的值5,将 *u赋值为00000022D02FF5B4这个地址上的值10,然后再将 *v赋值为5,由于u和v是形式变量,实际上就是00000022D02FF594这个地址上的值改为了10,而00000022D02FF5B4这个地址上的值改为了5,也即x=10,y=5