指针数组是一个数组,数组指针是一个指针。
一、指针数组
指针数组,名词最终落脚点为数组,也就是一个由指针构成的数组。
1.指针数组示例
int a[2][3] = {{1, 2, 3}, {2, 1, 3}};
// 由于[]结合优先级大于*所以arr本质为数组
int *arr[3] = {a[0], a[1]}; // 此处注意由于arr为数组,且数组元素为指针
2.指针数组的索引
printf("the size of the arr is %d bytes\n", sizeof(arr));
// output:the size of the arr is 24 bytes
// 由于arr中元素为指针,所以直接对arr进行算术运算地址偏移量为指针所占的8字节
printf("the address of arr is %p, the address of arr+1 is %p\n", arr, arr + 1);
// output:the address of arr is 000000dc6b5ff930, the address of arr+1 is 000000dc6b5ff938
// *arr表示取到了arr中的第一个指针,*(*arr+1)表示取到了arr中第一个指针的第二个元素
printf("the value of a[0][1] is %d, the value of a[1][1] is %d\n", *(*arr + 1), *(*(arr + 1) + 1));
// output:the value of a[0][1] is 2, the value of a[1][1] is 1
二、数组指针
数组指针,名词最终落脚点为指针,也就是一个指向数组的指针。也成为行指针。
1.数组指针示例
// 由于*先和arr1结合,所以arr1本质为指针,指针指向一个包含3个整数的数组
int (*arr1)[3] = a;
2.数组指针的索引
printf("the size of the arr1 is %d bytes\n", sizeof(arr1));
// output:the size of the arr1 is 8 bytes
// 由于arr1指向一个3个整数的数组,所以直接对arr1进行算术运算地址偏移量为3个整数数组所占的12字节
printf("the address of arr1 is %p, the address of arr1+1 is %p\n", arr1, arr1 + 1);
// output:the address of arr1 is 0000005b5ddff810, the address of arr1+1 is 0000005b5ddff81c
// *arr1表示取到了当前指向的数组,*(*arr1+1)表示取到了arr1当前指向的数组中的第二个元素
printf("the value of a[0][1] is %d, the value of a[1][1] is %d\n", *(*arr1 + 1), *(*(arr1 + 1) + 1));
// output:the value of a[0][1] is 2, the value of a[1][1] is 1