为什么字符型指针可以直接输出字符串
这是规定吗?#include<stdio.h>
int main() {
char* a = "nihao";
printf("%s", a);
return 0;
} 确实是可以的
当然你也可以用一个%c来输出一个字符指针
也可以用一个循环+%c来输出一个字符指针 本帖最后由 jhq999 于 2022-4-6 08:43 编辑
#include<stdio.h>
int main() {
int a = int("nihao");
printf("%s", a);//printf函数的%s,它要的是一个指针数值,它可不管你是不是字符串指针,以及这个指针值是不是指向字符串,反正遇到'\0'就结束输出,所以C就这么牛逼,反正按照老板
//吩咐一字不差的干完了,至于结果如何那是老板的问题,没错,老板就是你。
return 0;
} 主要是 scanf() 里面的 %s 功能,和指针无关。 其实数组char a的a所代表的地址与char *szA是一致的,你这么写char *szA = “xxx”就是把数组{‘x’, ‘x’, 'x’, ‘\0’}的首地址给了szA,c语言规定字符串是以\0结尾,这样你打印的时候c语言会一个一个输出字符到\0停止。
其实其他指针也可以这么用int arr = {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 = {0};
至于为什么输出printf("&s",szA)而不是printf("&s",*szA)这个我也讲了 字符串是本质是char数组,char * 是可以接受字符串的,c语言无论是输入数组还是指针都是根据首地址(就是指针指向的地址)向后依次输出,到\0结束(如果没有\0就会往后接着输出了,如果后面恰巧有\0就停,没有的话...那就不知道会怎摸样了)
页:
[1]