1.不同类型的指针在解引用时有着不同的意义
char*的只能对应1个字节
int*的只能对应4个字节
他们的如: int a =0; int * p = &a;(p里边放的就是a的地址)
对于上边的p,它是char*类型的解引用时只能修改一个字节,int *的解引用时只能修改4个字节
因为char*类型的一次只能访问一个字节,int*类型的一次只能访问4个字节(double则8,short则2)
double*类型的访问一个int类型的那么我感觉可能会越位
有一个int* 和char* 的灵活运用(微信搜)
2.指针变量+1在微信搜(指针变量的+1)
3.用*p改变数组的值(微信搜*p改变数组的值)
4.void*类型指针的可以容纳任何类型的变量的地址,
但也有局限性:不能进行指针的+-整数和解引用的运算
5.const修饰变量(指针变量也是变量)使它具有常属性(即不能被直接修改了)(但它本身也还是变量)如const a=20;
但是可以通过指针找到变量的地址从而进行修改(如果修饰的是const int *pa = &a;则 *pa==55; 也会失效)
6.const修饰指针的时候,可以放在*的左/右侧
但是意义不一样
在左侧时固定的是*pa,在右侧时固定的是pa
7.指针-指针得到的是(整数)且它的绝对值是两个指针之间的元素个数(小的指针-大的指针得到的是负值)
但是指针-指针的前提条件是两个指针指向同一块空间
8.\0的ASCII是0;
9.野指针概念:野指针就是指针指向的位置是不可知的(随机的,不正确的)
野指针成因1.没有初始化指针
例如
但是局部变量没初始化与全局变量没初始化得到的情况不完全相同
野指针成因2.指针越界访问
比如用指针指向数组的地址,然后越界赋值,那么程序会崩
野指针成因3:指针指向的空间释放了
例如:
在原来的a的地址的值被破坏之前,*p是10,但是一旦地址的值受到了外界的干扰,则*p就不一定是10了
所以当我们不知道给某个指针初始化为什么的时候,可以这样:int *p = NULL;(即空指针)
*111.NULL为((void *)0)
但即使是这样也不能:
int *p= NULL;
*p=20;
这样的话程序会崩
10.全局变量默认初始化为零
静态变量也是一样
放在静态区的变量默认都是零
11.可以这样
int *p = NULL;
int a = 10;
p = &a;
12.所以不要返回局部变量的地址