lun1ght 上午好☀️☀️☀️️
本答案参考ChatGPT-3.5
在C语言中,指针是用来存储变量地址的变量,可以通过指针来访问或修改变量的值。对于多维数组,指针可以用来指向数组的首地址或者指向数组中特定元素的地址。
根据你的代码和问题,我来解答你的疑惑:
-
什么时候可以拿到数组的首地址?
在C语言中,数组名可以被解释为指向数组首元素的指针,即数组名本身就是数组的首地址。所以,在你的代码中,将数组a的首地址赋值给指针p是合法的。
-
什么时候需要拿到元素地址?
当需要访问或修改数组中的某个特定元素时,需要拿到该元素的地址。这可以通过使用多级指针来实现。在你的代码中,为了访问 a[1][3] 这个元素,使用了 *( *(p+1) + 3)的方式,其中 p+1 取得了数组a的第二行的地址,然后 *(p+1) 取得了第二行的首元素地址,最后 *( *(p+1) + 3) 取得了第二行第四列元素的值。
对于你的问题的解答是正确的。关于为什么 (*p)[4] 可以通过 p=a 来赋值,而单纯的定义一个指针 p 不能通过 p=a[0] 来赋值,是因为 (*p)[4] 是一个指向包含四个整型元素的一维数组的指针,可以直接将数组 a 的首地址赋给它。而单纯的定义一个指针 p,只能赋值为一个整型元素的地址,因此需要用 p=a[0] 来取得第一行第一列元素的地址。
下面是修改后的代码:
#include <stdio.h>
int main() {
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4]; // 声明一个指向包含四个整型元素的一维数组的指针
p = a; // 将数组a的首地址赋给指针p
int i=1, j=3;
printf("%d ", *(*(p+1)+3)); // 访问数组a的第二行第四列元素的值
return 0;
}