lun1ght 2024-03-16 05:18 采纳率: 75%
浏览 4
已结题

为什么字符指针只能拿到指针数组的元素地址而不能拿到首地址

在代码中,如果定义一个int型数组a,那么int型指针p可以直接拿到这个数组的首地址,但是如果定义一个char型指针数组,那么char型指针p1只能拿到这个数组的元素地址,这是为什么


#include <stdio.h>
int main()
{
    int a[2]={1,2},*p;
    char *a1[]={"hello"},*p1;
    p=a;
    p1=*a1;
    printf("%d ",*p);
    printf("%d ",a1[0]);
    return 0;
}

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-16 05:18
    关注

    引自免费微信小程序:皆我百晓生

    在C语言中,数组名实际上代表了数组的首地址。对于非字符指针类型的数组(如int a[2]),你可以直接将数组名赋值给同类型指针变量(如int *p),这样指针变量就能获得整个数组的首地址。

    而对于字符指针数组(如char *a1[]),它存储的是多个字符串的地址(即多个字符数组的首地址)。当你尝试将字符指针数组的元素赋值给一个字符指针变量(如char *p1)时,实际上是获取了字符指针数组中的一个元素的值,这个元素本身就是一个指向字符串的指针,而不是字符指针数组本身的首地址。

    所以,在你的代码示例中:

    char *a1[]={"hello"},*p1;
    p1=*a1;
    

    这里,*a1 是对 a1[0] 的解引用操作,由于 a1[0] 存储的是字符串 "hello" 的首地址,因此 p1 现在也指向了该字符串的首地址,而非字符指针数组 a1 的首地址。

    如果你想让 p1 指向字符指针数组 a1 的首地址,你应该这样做:

    char *a1[]={"hello"}, **p1;
    p1 = a1;
    

    这样一来,p1 就是一个指向字符指针的指针,其存储的是字符指针数组 a1 的首地址。但请注意,此时通过 *p1 间接访问得到的是字符指针数组的第一个元素(即 "hello" 字符串的地址)。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

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

悬赏问题

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