21年4月19数组与指针(一)
1.const 与 *
2.指针类型
3.数组名与数组首地址
ps : 指针加1,应该说是指针偏移一个单位,这个单位大小就是指针的类型
注意区分 指针 与 指针的类型 https://blog.csdn.net/weixin_44781107/article/details/89405934
1.const 与 *
const int * p1 = &a;
int * const p2=&a;
const 在 * 左边的时候,限制 * . 也就是限制指向(解引用)的能力,表现在p1的地址变量可以修改(p1=&b;),可以读a的值,但是不能对a赋值。
const 在 * 右边的时候,限制 p2 . 也就是限制指针自身(指针就是地址),表现在p2的地址变量不可以修改(p1=&b;不通过),可以读a的值,可以对a赋值(赋值就是解引用的能力)。
指针 ≠ 指针变量
指针就是地址,指针变量就是存储地址的变量。就和整型与整型变量的关系。
2.指针类型
野指针 int *p; 定义的时候没有初始化
空指针 int *p=nullptr; 定义的时候初始化为空
失效指针 int *p = (int*)malloc(sizeof(int)*n);
free(p);
完成这两句后就是失效指针。(内存释放了,但是该指针任然指向该内存的地址)(很危险)
(
3.数组名与数组首地址
下图的 ar++; ar=ar+11; 这些操作是违法的,为什么?
数组名作为数组首地址的时候,自身是常性值,就是不能改变自身的值,这两个语句都改变了自身的值
但是为啥ar+1, &ar+1 可以显示出结果?
因为是在这个值的基础上进行运算得出的结果,这个过程并没有改变常性值的自身。
ar 是 数组首元素的地址(和&arr[0]一样) 所以加一加了4字节
&ar是 整个数组ar的地址。 所以加一加了20字节(整个数组的大小)
值相同,但是“意义不同”