我目前正在学习C语言,对字符数组和字符串之间的区别以及它们的工作原理感到困惑。
问题1:
为什么源代码1和源代码2的结果不同?
源代码1:
#include <stdio.h>
#include <string.h>
int main(void)
{
char c[2]="Hi";
printf("%d\n", strlen(c)); //returns 3 (not 2!?)
return 0;
}
源代码2:
#include <stdio.h>
#include <string.h>
int main(void)
{
char c[3]="Hi";
printf("%d\n", strlen(c)); //returns 2 (not 3!?)
return 0;
}
问题2:
字符串变量和字符数组有何不同?如何声明它们以允许存储\0,并具有最小所需的索引号(请阅读下面的代码)?
char name[index] = "Mick"; //should index be 4 or 5?
char name[index] = {'M', 'i', 'c', 'k'}; //should index be 4 or 5?
#define name "Mick" //what is the size? Is there a \0?
问题3:
终止的NUL只跟随字符串而不是字符数组吗?所以字符串“Hi”的实际值是[H][i][\0],而字符数组“Hi”的实际值是[H][i]?
问题4:
假设c[2]将存储带有\0的“Hi”(不确定如何完成此操作,可能使用gets(c)
?)。那么\0存储在哪里?它存储在c[2]之后的“某个地方”,变成[H][i]\0,还是c[2]会被追加一个\0,变成c[3],即[H][i][\0]?
有时候字符串/字符数组后面会跟着\0,这让我很困惑,当我使用if (c1==c2)
比较两个变量时,它很可能返回FALSE(0)。
非常感谢详细的答案。但是保持简洁的回答有助于我的理解 :) 提前感谢您!