我尝试通过以下方式计算字符数组的长度:
char *s="abcde";
int n=sizeof(s)/sizeof(s[0]);
cout<<n;
无论字符串有多长,n都是常数值4。而我已将数组声明为
char s[]="abc";
int n=sizeof(s)/sizeof(s[0]);
cout<<n;
输出仍然是4.我理解在第二种情况下,它包括结束字符'\ 0',因此输出。 我唯一不理解的是为什么我在第一种情况下得到一个恒定的输出。
答案 0 :(得分:3)
使用char *s
,您可以创建指向其他内存的指针s
。使用char s[] = ...
,您可以创建一个包含N个字符的数组。
如果你这样看它可能会更容易:
对于指针版本char *s = "abcde"
,它将类似于
+---+ +-----------+ | s | ---> | "abcde\n" | +---+ +-----------+
对于数组的情况,char s[] = "abc"
就像
+---------+ | "abc\0" | +---------+
这应该很容易理解为什么你不能在指针上使用sizeof
,因为它返回指针的大小而不是它指向的大小。我还添加了所有字符串文字都存在的字符串终止符,这就是为什么你得到数组的大小为4,它实际上是4个字符。
答案 1 :(得分:3)
char *s
是指向char或char序列的指针。在32位架构上,它将是4个字节宽,因此sizeof(s)
将为4.单个字符(通常)为1个字节,因此sizeof(s[0])
将为1.因此,n
将为0
当你使用char[]
类型时,编译器将它视为一个固定长度的序列,它只是计算出序列对你来说有多长,在你的情况下它是4个字符长。但是,如果你有:
char s[]="Hello, world";
int n=sizeof(s)/sizeof(s[0]);
然后n
将为13,因为您输入的是12个字符,最后是空终结符。
答案 2 :(得分:2)
在此代码段中
char *s="abcde";
int n=sizeof(s)/sizeof(s[0]);
cout<<n;
是指针。因此sizeof(s)等于系统中指针的大小。在你的系统中,指针的大小等于4.因为s [0]的类型是char,那么它的大小等于1,你得到值4.
在第二个代码段
中char s[]="abc";
int n=sizeof(s)/sizeof(s[0]);
cout<<n;
是一个数组。其大小由初始化程序的大小决定。作为字符串文字&#34; abc&#34;大小等于4,因为终止零也被计算,然后数组s的大小是4.如果你要写的话
char s[]="abcde";
int n=sizeof(s)/sizeof(s[0]);
cout<<n;
然后字符串文字的大小等于6,相应地,数组的大小也将等于6。
您可以使用以下方式重写相同的代码
char s[6]="abcde";
int n=sizeof(s)/sizeof(s[0]);
cout<<n;
如果您将此代码编写为
char s[10]="abcde";
int n=sizeof(s)/sizeof(s[0]);
cout<<n;
然后数组的大小将等于10,尽管字符串文字的大小等于6.数组中没有初始化程序的所有其他元素将被零初始化。这就是数组看起来像
[a][b][c][d][e]['\0']['\0']['\0']['\0']['\0']
答案 3 :(得分:0)
在第一种情况下,s
是char*
类型的对象。 sizeof(s)
计算此“指向char的指针”对象的大小,该对象为4(在执行环境中),而不是s
指向的字符串的长度(strlen(s)
评估的字符串的长度到)。