一、指针也是一种数据类型
1、指针也是一种变量,占有内存空间,用来保存内存的地址,也可以使用sizeof(p)来测试指针变量占有的空间大小。注意:在32位系统和64位系统下,指针占有的空间大小是不一样的。
2、*p操作内存
在指针声明时候,*号表示所声明的变量是指针
在指针使用时候,*号表示操作指针所指向的内存空间中的值
*p相当于通过地址(p变量的值)找到一块内存,然后操作内存
*p放在等号的左边赋值(给内存赋值)
*p放在等号的右边取值(从内存获取值)
3、指针变量和他指向的内存块是两个不同的概念
含义1、给p赋值 p=0x1111;只会改变指针变量值,不会改变所指向的内存;p=p+1;p++
含义2、给*p赋值*p=’a’;不会改变指针变量的值,只会改变指针所指向的内存块的值
含义3、等号(=)左边*p表示给内存赋值,等号(=)右边*p表示取值
含义4、等号(=)左边 char *p
含义5、保证所指向的内存块是可以修改的
4、指针是一种数据类型,指的是他所指向的内存空间的数据类型
含义1、指针不长(p++),根据所指向的内存空间数据类型来确定
如果定义
unsigned int a = 10;
unsigned int *p = &a;
则p++的效果等于(unsigned int *p)+sizeof(a);
注意:建立指针指向谁,就把谁的地址复制给指针
含义2、不断的给指针变量赋值,就是不断的改变指针变量(和指针所指向的内存空间没有任何关系)
二、间接赋值(*p)是指针存在的最大意义
1、指针变量和他所指向的内存块变量是两个不同的概念
2、指针指向某个变量,就是把这个变量的地址复制给指针
3、*p间接复制成立的条件:
1)2个变量(通常一个实参,一个形参)
2)建立关系,实参取地址赋给形参指针
3)*p形参去间接修改实参的值
int num = 0; // 实参
int *p = # // 将num的地址赋值给p,p的值为num的地址
num = 1; // 直接修改
*p = 2; // 通过*形参ßà间接的改变实参的值
4)函数调用时候,用 n 指针(形参)改变 n-1 指针(实参)的值
关于野指针的产生的原因以及避免的方法,可以参见https://blog.csdn.net/zhemingbuhao/article/details/89012199