这是C语言中的字符串数组。我试着打印这些元素,但是程序不打印它们。代码中的错误是什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char day[7]={"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};
printf("%sn", day[0]);
}
char day[7];
声明了一个char
s数组,它只能容纳7个字节(如果是字符串的话,包括空终止符),而不是7个长度不确定的字符串。
您可以声明一个指向char
或char *
s的指针数组,其中每个指针指向内存中的char
s序列。
const char *day[7] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
在内存中,它看起来像这样:
--------------------------------------
day[0] -> | "Saturday"
--------------------------------------
day[1] -> | "Sunday"
--------------------------------------
day[2] -> | "Monday"
--------------------------------------
day[3] -> | "Tuesday"
--------------------------------------
day[4] -> | "Wednesday"
--------------------------------------
day[5] -> | "Thursday"
--------------------------------------
day[6] -> | "Friday"
--------------------------------------
由于day
是一个指针数组,你可以使它的元素(即指针)指向内存中的其他地方,但你不能改变字符串字面量本身。
此声明
char day[7]={"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};
是无效的。
没有声明字符串数组。声明了一个由7个字符组成的数组,这些字符由字符串字面值的地址初始化。
编译器应该发出一个相对于此声明的消息,因为没有从类型char *
(初始化表达式的类型)到类型char
的隐式转换。
char * day[7] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};
或者更像
const char * day[7] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};
因为你不能改变字符串字面值(尽管在C中与c++相反的字符串字面值有非常量字符数组的类型)
在这些声明中,具有数组类型的字符串被隐式地转换为指向其第一个字符的指针。
或者像
这样的二维数组char day[7][10] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};
在此声明中,所有字符(包括字符串字面值的结束零字符' '
)都用于显式初始化所声明数组的元素。数组中没有相应的显式初始化式的所有字符将被零初始化。