c指針深入理解--指針和数组
1、概念
-》指针:
int *p:指针,可以指向一维数组等等
-》指针数组:
int *p[5]:包含五个 int * 元素,即每个元素都是指针
一维数组:
int arr[5] = {1,2,3,4,5};
p[0] = &arr;
例子:访问第二个,*(*(p+0)+1)
-》数组指针:
int (*p)[5]:指向 五个连续地址的 int 元素(指向首元素地址),即每个元素都是普通的int类型数据
一维数组:
int arr[5] = {1,2,3,4,5};
p = &arr;
例子:访问第二个,*(*(p+0)+1)
总结:
相同点:
数组指针和指针数组都是指向二维维数组。指向一维数组的时候,可以当只有一行多列的二维数组来访问
不同点:
指针数组:指向数组的时候,需要指定具体那个元素(指针)指向一维数组
数组指针:直接指向一维数组即可。
注意:
1)数组表示法和指针表示法的区别:
例子:
int arr[3] = {1,2,3};
访问元素:arr[2] vs *(arr+2)
arr[1]:机器码从arr开始移动到2位置,再取出内容
*(arr+2):机器码直接在跳到2位置,取出内容
结论:
1)数组表示法,效率会更低。相反,指针表示法,效率高
2)数组名不能赋值
延伸:不可以对数组名进行赋值,不可以对const修饰的左值赋值,不可以对string进行赋值
例子:
int arr[3] = {1,2,3},*p;
p = arr;
错误做法:
arr = arr + 1;
解析:数组名不是左值,不能被修改(这种解析感觉有点不专业,后续需研究修改)
正确做法:
p = arr + 1;
3)二维数组访问:
int arr[3][7] = {1,2,3,4,5,6,7,
8,9,10,11,12,13,14,
15,16,17,18,19,20,21};
地址偏移:*(arr+1)[1] 效果相当于 *(arr+2),偏移了两个行地址