鱼C论坛

 找回密码
 立即注册
查看: 1764|回复: 4

[已解决]为什么字符型指针可以直接输出字符串

[复制链接]
发表于 2022-4-5 23:56:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是规定吗?
#include<stdio.h>

int main() {
        char* a = "nihao";
        printf("%s", a);
        return 0;
}
最佳答案
2022-4-6 09:21:10
其实数组char a[10]的a所代表的地址与char *szA是一致的,你这么写char *szA = “xxx”就是把数组{‘x’, ‘x’, 'x’, ‘\0’}的首地址给了szA,c语言规定字符串是以\0结尾,这样你打印的时候c语言会一个一个输出字符到\0停止。

其实其他指针也可以这么用int arr[10] = {0};int *p = arr;

但是数组指针和普通指针并不是一个东西,&arr这个指针会指向整个数组(当然他的值还是第一个元素,因为指针一般都是从第一个元素开始指的,以后的struct也是这样),因为是指向整个数组的,所以这个数值+1或-1的时候偏移量就是整个数组的大小
还有就是因为arr这种写法本质是声明数组所以sizeof(arr)会返回数组的大小,如果是szA那种写法sizeof(szA)只会返回指针的大小(一般是4),而且如果在函数的参数列表中作为一个参数 void fun(char cArr[])这个[]什么都不用填,填了也没用他就是一个指针了所以一般接受字符串写的是指针:这样void fun(char *cArr),创建字符串使用数组:这样 Char szBuffer[10] = {0};

至于为什么输出printf("&s",  szA)而不是printf("&s",  *szA)这个我也讲了 字符串是本质是char数组,char * 是可以接受字符串的,c语言无论是输入数组还是指针都是根据首地址(就是指针指向的地址)向后依次输出,到\0结束(如果没有\0就会往后接着输出了,如果后面恰巧有\0就停,没有的话...那就不知道会怎摸样了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-6 00:45:49 | 显示全部楼层
确实是可以的
当然你也可以用一个%c来输出一个字符指针
也可以用一个循环+%c来输出一个字符指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-6 07:41:23 | 显示全部楼层
本帖最后由 jhq999 于 2022-4-6 08:43 编辑
#include<stdio.h>

int main() {
        int a = int("nihao");
        printf("%s", a);//printf函数的%s,它要的是一个指针数值,它可不管你是不是字符串指针,以及这个指针值是不是指向字符串,反正遇到'\0'就结束输出,所以C就这么牛逼,反正按照老板
                                //吩咐一字不差的干完了,至于结果如何那是老板的问题,没错,老板就是你。
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-6 08:09:40 From FishC Mobile | 显示全部楼层
主要是 scanf() 里面的 %s 功能,和指针无关。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-6 09:21:10 | 显示全部楼层    本楼为最佳答案   
其实数组char a[10]的a所代表的地址与char *szA是一致的,你这么写char *szA = “xxx”就是把数组{‘x’, ‘x’, 'x’, ‘\0’}的首地址给了szA,c语言规定字符串是以\0结尾,这样你打印的时候c语言会一个一个输出字符到\0停止。

其实其他指针也可以这么用int arr[10] = {0};int *p = arr;

但是数组指针和普通指针并不是一个东西,&arr这个指针会指向整个数组(当然他的值还是第一个元素,因为指针一般都是从第一个元素开始指的,以后的struct也是这样),因为是指向整个数组的,所以这个数值+1或-1的时候偏移量就是整个数组的大小
还有就是因为arr这种写法本质是声明数组所以sizeof(arr)会返回数组的大小,如果是szA那种写法sizeof(szA)只会返回指针的大小(一般是4),而且如果在函数的参数列表中作为一个参数 void fun(char cArr[])这个[]什么都不用填,填了也没用他就是一个指针了所以一般接受字符串写的是指针:这样void fun(char *cArr),创建字符串使用数组:这样 Char szBuffer[10] = {0};

至于为什么输出printf("&s",  szA)而不是printf("&s",  *szA)这个我也讲了 字符串是本质是char数组,char * 是可以接受字符串的,c语言无论是输入数组还是指针都是根据首地址(就是指针指向的地址)向后依次输出,到\0结束(如果没有\0就会往后接着输出了,如果后面恰巧有\0就停,没有的话...那就不知道会怎摸样了)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 00:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表