c语言指针初始化和赋值

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 结束语

对指针的基本理解记录到这里。下章记录对函数指针的理解。

最后编辑于
© 著作权归作者所有,转载或内容合作请联系作者

推荐阅读 更多精彩内容