一维数组和指针
int array[3] = {1, 2, 3}
printf("&array:%p array:%p &array[0]:%p\n", &array, array, &array[0]);
&array表示的是整个数组的地址,array表示数组首地址,&array[0]第一个元素地址。三者打印出来的值都是相同的,但是表示的空间不同,其中array和&array[0]代表的是同一个空间,&array表示的是整个数组的空间。
array + 1 //指向第二个元素的地址,即array[1]的地址,即偏移sizeof(int)个字节
&array + 1 //向后偏移整个数组的大小,即3 * sizeof(int)个字节
int *p = array;
//p + 1 ---> &array[1] ---> array + 1 三者相同
//*(p + 1) ---> array[1] ---> *(array + 1) 三者相同
二维数组和数组指针
数组指针本质上是指针,指针指向的元素是数组。
/*array --> 代表第一行地址
array[0] --> 代表第一行第一个元素地址
*(array + 1) == array[1] --> 代表第二行第一个元素地址
array + 1 --> 代表第二行地址
array[1] + 1 --> 代表第二行第二个元素地址
&array --> 整个二维数组地址
&array + 1 --> 偏移整个二维数组大小*/
int main(int argc, char const *argv[])
{
int array[2][3] = {1, 2, 3, 4, 5, 6};
int (*p)[3] = array;
printf("%d\n", array[1][1]);
printf("%d\n", *((int *)(array + 1) + 1));
printf("%d\n", *(array[1] + 1));
printf("%d\n", *(p[1] + 1));
printf("%d\n", *(*(p + 1) + 1));
return 0;
}
上面五个打印出来的结果都是5。p是一个数组指针,指向的元素是一个拥有3个元素的一维数组。p[1]就表示array的第二行的首地址,p[1] + 1也就表示为第二行第二个元素的地址,再提取指针对于空间的值即为5。p + 1表示将指针偏移到array第二行的首地址,* (p + 1)表示了第二行第一个元素的地址,* (p + 1) + 1即表示第二行第二个元素的地址。
注意:* (p + 1)与p + 1所代表的空间是不同的,* (p + 1)代表一个int的空间,p + 1代表整个数组3个int的空间