char *和char []之间的区别(2)

时间:2014-02-01 12:11:39

标签: c++ arrays string pointers

我尝试通过以下方式计算字符数组的长度:

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',因此输出。 我唯一不理解的是为什么我在第一种情况下得到一个恒定的输出。

4 个答案:

答案 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)

在第一种情况下,schar*类型的对象。 sizeof(s)计算此“指向char的指针”对象的大小,该对象为4(在执行环境中),而不是s指向的字符串的长度(strlen(s)评估的字符串的长度到)。