1.char s[] char *s char *s[]的区别和使用

如题所述

第1个回答  2022-06-21

定义 char a[]="nihaoma"; 把 nihaoma\0 字符依次存入连续的存储单元中(a[]数组)
其中的a有几个含义:
1.数组名a
2.数组的起始地址
3.数组中第一个元素a[0]的地址(也就是2.数组的起始地址)
也就是 a = &a[0];

%s用于输出一个字符数组,传入的值是地址,输出的值是该地址之后的连续元素,遇到\0结束(字符的结束符停止)
char s[5]="1234";

这个和初学 int类型 固定数组 和 动态数组很类似
char s[10]="hello";
char *s="hello";
这两种定义表达字符串其实是一样的,可以理解成静态和动态,在这里不做进一步讨论。

printf("%s",s);
printf("%s",s) //用于区别 换成了b
我们会发现,两者的输出是一样的 都是 hello
之前我们说过%s的作用是,传入字符数组的首地址,然后做连续输出,到\0结束位置
这里我们传入的printf("%s",s) 两种方法传入的都是字符数组的首地址(第一个元素的地址)
所以我们如果这样输出
printf("%c",s[0])
printf("%c", s) //s表示首地址, s表示地址取值 。值是h
输出结果都为 h。 它是第一个字符

有了上边对 s[] 和 s的介绍, s[]就很好理解了,我们可以直接看作

故定义char *s[]的时候,我们输入的是多个字符数组(多个字符串)
如下:
char *s[]={"lhd","is","my","son"};
printf("%s %s %s %s\n",s[0],s[1],s[2],s[3]);
其中s[0] s[1] s[2] s[3]分别是 "lhd" "is" "my" "son"的首地址(第一个元素的地址)

换成%c:输出第一个字符
char s[]={"lhd","is","my","son"};
printf("%c %c %c %c\n",
s[0], s[1], s[2],*s[3]);
传入的不能是地址了,而应该是字符。
*s[0] *s[1] *s[2] *s[3] 分别是 l i m y

先写到这里 后续有好的理解再补充。

相似回答