lun1ght 2024-03-14 04:35 采纳率: 75%
浏览 8
已结题

c语言指针什么时候可以要拿到首地址,什么时候要拿到元素地址

请问为什么(*p)[4]的时候,可以p=a,但是如果单纯定义一个指针p,那只能用p=a[0]呢不然会报错,是因为(*p)[4]指向一个包含四个整形的一维数组,所以只需要拿到数组a的0行地址就行了,而p只是一个整形指针,所以需要拿到0行0列的元素地址,不然单纯拿到0行首地址系统不知道有几列吗?


#include <stdio.h>
int main()
{
    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},(*p)[4];
    p=a;
    int i=1,j=3;
    printf("%d ",*(*(p+1)+3));
    return 0;
}
  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2024-03-14 04:35
    关注

    lun1ght 上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    在C语言中,指针是用来存储变量地址的变量,可以通过指针来访问或修改变量的值。对于多维数组,指针可以用来指向数组的首地址或者指向数组中特定元素的地址。

    根据你的代码和问题,我来解答你的疑惑:

    1. 什么时候可以拿到数组的首地址? 在C语言中,数组名可以被解释为指向数组首元素的指针,即数组名本身就是数组的首地址。所以,在你的代码中,将数组a的首地址赋值给指针p是合法的。

    2. 什么时候需要拿到元素地址? 当需要访问或修改数组中的某个特定元素时,需要拿到该元素的地址。这可以通过使用多级指针来实现。在你的代码中,为了访问 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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月19日
  • 已采纳回答 3月14日
  • 创建了问题 3月14日