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

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条回答 默认 最新

  • Kwan的解忧杂货铺 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日

悬赏问题

  • ¥15 写出这个有没有人能写一下今天中午就要
  • ¥30 设计一个图形用户界面来控制你机械臂的运动
  • ¥30 3d打印机无法识别到SD卡,如何解决?(相关搜索:格式化)
  • ¥15 RPG游戏架构设计和开发方法
  • ¥15 前端返回pdf时不显示内容
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像