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

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

在代码中,如果定义一个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日