为什么输出时要用p,p不是保存地址吗?所以按理输出来的值应该是一个地址

为什么输出时要用p,p不是保存地址吗?所以按理输出来的值应该是一个地址

img

请讲详细一点(基础一点)

%s是字符串,*p是字符串的第一个字符,所以不匹配。
你的代码编译应该也有问题,ae是不能直接转换为char * 的。
如下修改,可以输出hello。如果要输出yes,需要将p指针跳过ae的第一个字符串长度+1,即跳过第一个字符串的字符串结束符。
也不能将ae直接转换为char **

int main()
{
    char ae[][20] = {"hello","yes"};
    char *p = (char*)ae;
    printf("%s",p);
    return 0;
}

(1)修正你的说法,你如果用的是C语言,C语言中没有引用的概念,引用是 C++里的概念。
(2)ae是二维数组的首地址,相当于二级指针,p是char *类型,是一级指针,用二级指针给一级指针赋值本身就存在风险;你如果用高版本的vs,char *p = ae这里会直接报错,低版本中会给警告。
(3)p是char 类型,p就是char类型,用%s输出是不对的,%s用于字符串类型或字符数组输出显示,%c用于单个字符输出显示。
代码修改如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char ae[][10] = { "你好","暗示" };
    char* p = ae[0]; //这里用ae[0]赋值
    p = ae[1];
    printf("%s", p); //这里输出用p
    system("pause");
    return 0;
}

1.在c语言里字符串和char数组就是一回事
2.char数组变量本身就是一个指针,它指向数组的首地址
3.要输出字符串,需要传入字符串的首地址
4.所以你在scanf("%s",s)的时候(假如s是个char[]),逗号后面传s也行,传&s也行

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632