基本的C指针问题

时间:2010-08-31 21:12:40

标签: c

我正在阅读“学习C”一书,并且遇到了一个我真的不明白的问题。练习的目的是找到这段代码的问题:

char c;

c = 'a';

printf("c holds the character %c.",c);

..然后它给出了解释:“文本字符串”a“由两个字符组成,'a'和终止零字节。变量c的大小只有一个字节。即使c长度为2个字节,你无法以这种方式复制文本字符串。尝试将文本一次一个字节复制到一个足够大的变量中,以保存文本字符串及其终止零字节。“

然而,当我运行上面的代码时 - 它完全正常。我以为我理解为什么它是坏的理论 - 在字符串结尾处整个终止0,所以我重写了这样的代码来测试:

char c[2];

*c = 'a';

printf("c holds the character %c.",c);

但这会产生问题。我开始对这个问题感到困惑。第二组代码不会将字母'a'传递给c [0]处的指针,然后将终止0传递给c [1] - 完全使用分配给该数组的2个空格?

9 个答案:

答案 0 :(得分:9)

  

说明:“文本字符串”a“由两个字符组成,包括'a'和终止零字节。

这是真的,但'a'不是"a"'a'是一个字符。因此'a'非常适合char

将一个char逐个写入字符串的示例应如下所示:

char str[2];
str[0] = 'a';
str[1] = 0; /* because nothing guarantees array items are initialized to 0 */
printf("str holds the string %s.", str);

答案 1 :(得分:8)

文字错误,否则您正在错误地转录代码。

在C中,双引号字符串以空值终止。单引号字符只是一个字符。

答案 2 :(得分:2)

在C中,单引号表示字符常量。

答案 3 :(得分:2)

在您的第二个示例代码段中,c被解释为指向数组中第一个元素的指针(即char *),而不是char。你可以这样做:

printf("c holds the character %c.", *c);

printf("c holds the character %c.", c[0]);

printf("c holds the character %s.", c);

在最后一个示例中,%s告诉printf()期望字符串而不是字符。但是,在这种情况下,您必须将c[]的第二个元素设置为“空终止符”(使用例如c[1] = '\0'),否则printf()将不知道字符串结束的位置,并且可能会打印无限量的垃圾。

答案 4 :(得分:1)

C中的字符串实际上是字符数组。所以char c [2];是c的声明,它是一个包含2个元素的字符数组。用'a'分配它是错误的,因为它是一个字符文字,你应该为它分配一个字符串文字。请记住前面评论中所述的单引号和双引号之间的区别。

答案 5 :(得分:0)

在C中,'c'是单个字符,而“c”是字符串。 (注意双引号)。本书作者对变量占用2个字节的解释只适用于第二种情况。

在第一个代码段中,您将一个完全有效的1字节字符分配给char变量并打印它。所以它有效。

在你的第二个代码段中,你将一个char分配给char数组(如果你想把它称为一个字符串),而不是'null-terminated'它。当你在上面调用printf函数时,printf不知道字符串的结束位置。因此printf的行为在这里未定义。

答案 6 :(得分:0)

这本书的解释出了点问题。 'a'是单个字符(注意单引号),“a”是字符串。 现在“a”确实是0x00终止了。但'a'不是。

我现在得出的结论是,当你从书中复制信息时,要么出现乱码......或者......标题“学习C”是本书作者的目标。

答案 7 :(得分:0)

在C单引号中描述单个字符,即'a' 而在双引号“a”中,它构成了null teminated string

所以这个

int main(void)
{
    char s[2]="a";

    // s='a'; leads to error incompatible types.........
    printf("%s",s);

    return 0;
}

可以正常使用

答案 8 :(得分:0)

在C编程中,单引号中的字符:'a'和双引号中的字符:“a”具有不同的含义。

通过将一个字符放在单引号中,表示您希望将“a”解释为单个字符,因此不会添加终止空字节。

如果你要将你的角色放在双引号中,那么它会被声明为一个字符串。在这种情况下,终止空字节会自动连接到结尾,您无需担心。结果字符串是:

"a/0"

如果要仅使用单引号将str变量初始化为字符串“a”,则必须显式添加终止空字节。

char str[2];
str[0] = 'a';
str[1] = '/0';
printf("str holds the string %s.", str);

否则你可以使用双引号将str的第一个索引初始化为“a”,并在第二个索引处自动添加终止空字节。

char str[2];
str[0] = "a";