【问题标题】:Difference between char* and char[] (2) [duplicate]char* 和 char[] 的区别 (2) [重复]
【发布时间】:2014-02-25 04:44:39
【问题描述】:

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

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

【问题讨论】:

标签: c++ arrays string pointers


【解决方案1】:

使用char *s,您可以创建一个指向其他内存的指针s。使用char s[] = ...,您可以创建一个包含 N 个字符的数组。

如果你这样看可能会更容易:

对于指针版本,char *s = "abcde",它将类似于

+---+ +-----------+ |小号 | ---> | "abcde\n" | +---+ +-----------+

而对于数组的情况,char s[] = "abc" 会像

+----------+ | "abc\0" | +----------+

这应该可以很容易地看出为什么你不能在指针上使用sizeof,因为它返回的是指针的大小而不是它指向的内容。我还添加了所有字符串文字都存在的字符串终止符,这就是为什么你得到数组的大小 4,它实际上是四个字符。

【讨论】:

    【解决方案2】:

    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 个字符,加上末尾的空终止符。

    【讨论】:

    • 我很高兴 C++11 终于禁止将字符串字面量分配给 char*
    【解决方案3】:

    在这段代码中sn-p

    char *s="abcde";
    int n=sizeof(s)/sizeof(s[0]);
    cout<<n;
    

    s 是一个指针。所以 sizeof(s) 等于系统中指针的大小。在您的系统中,指针的大小等于 4。由于 s[0] 的类型是 char,因此它的大小等于 1,您得到的值是 4。

    在第二个代码sn-p

    char s[]="abc";
    int n=sizeof(s)/sizeof(s[0]);
    cout<<n;
    

    s 是一个数组。它的大小由初始化器的大小决定。由于字符串文字“abc”的大小等于 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;
    

    那么尽管字符串字面量的大小等于 6,但数组的大小将等于 10。数组中没有初始化器的所有其他元素将被初始化为零。那就是数组看起来像

    [a][b][c][d][e]['\0']['\0']['\0']['\0']['\0']
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2014-10-28
        • 2013-05-16
        • 2011-12-14
        • 1970-01-01
        • 2014-11-07
        • 1970-01-01
        • 2013-03-22
        • 2011-11-25
        • 1970-01-01
        相关资源
        最近更新 更多