0x01 指针的总体理解
指针本质上是一个变量,这个变量特殊的地方是只用来保存内存地址。
有不同类型的数据,但是在内存中,数据是没有类型的。不管什么类型的指针的值都是一定长度的整型。不同类型的指针只是说明指针指向的数据的类型不同,取值时取的内存长度不同。
0x02 指针的初始化和赋值
指针初始化时,要赋值内存地址,而不能直接赋值给指针变量。没有初始化的指针是不能对其指向的内存的数据进行赋值的。
int a = 0;
int *b = 0;// 是直接初始化唯一合法的
int *c = 1;//非法,因为对于变量c 还没有指向具体的内存地址,这时候就赋值,不知道往哪块地址上写数据。
正确的姿势如下:
int argA = 10;
int *pa = &argA;//将 argA 的地址赋值给 pa
*pa = 11;// 将pa 指向的数据修改为 11, 这时候argA 的值已经修改为11了。
int *pb ;
int argB = 20;
pb = &argB;//这时候*pb 为20
pb = pa;//这时候*pb 为11, pb 指向了pa 所指向的值
char *str = "abcdefg";// 意义是将字符串的首地址赋值给指针变量 *str,而不是将整个字符串赋值给str,c 语言中没有对字符串整体处理的机制。
*str = "hijklmn"; // 非法,不能将字符串的首地址赋值给指针指向的内存。
0x03 指针常量
当知道具体的内存地址数值,赋值给指针变量时,如下
int *pc = (int *)0x12345678; // 将 0x12345678强制转化为int 类型的指针,来保证左右数据类型一致。
0x04 void *型指针
void * 表示定义一个指针,可以指向任意类型的数据的地址。可以和其它任何类型的指针(函数指针除外)相互转化而不需要类型强制转换。
0x05 指向指针值的指针与其解引用
指针是一种变量,也是可以用指针指向的。指针的值是是内存地址,也是一个整数值,是存放在内存中的,也是可以用其他指针指向的。
可以将一个指针的地址存放到另一个指针中,如下:
int i = 10;
int *pi = &i;// pi 指向 i 的内存地址
int *ppi = π //ppi 指向pi 的内存地址
对ppi 解引用会得到想要的数据,下面打印的结果是一样的,都是10。
printf("%d",i);
printf("%d",*pi);//*pi 是pi 指向的内容,就是i的值。
printf("%d",**ppi);// *ppi 是ppi 指向的内容,就是pi的值, pi的值就是 i的地址,再次解引用就是取其地址对应的数据,据说i的值。
0x06 结束语
对指针的基本理解记录到这里。下章记录对函数指针的理解。