字符串是否是常量
字符串常量通常被存储在只读内存区域(如程序的文本段),这意味着它们一旦被定义,就不能被修改;
- 直接定义的字符串字面量:如 char *str = “Hello, World!”;,这里的 “Hello, World!” 是一个字符串常量。注意,虽然这里使用 char * 类型的指针来指向它,但字符串内容本身是不可修改的。
- 字符串字面量在表达式中的使用:只要字符串字面量(即被双引号包围的字符串)出现在表达式中,无论其上下文如何,它都被视为常量。例如,在函数参数、数组初始化、条件判断等场景中使用字符串字面量时,它们都是常量。
- 通过字符串字面量初始化的字符数组:虽然可以使用字符串字面量来初始化字符数组,如 char arr[] = “Hello, World!”;,但这种方式下,数组 arr 并不直接等同于字符串常量。arr 是一个数组,其内容在初始化时被字符串常量 “Hello, World!” 的内容所复制,但 arr 本身不是常量,其内容(在程序运行时)是可以被修改的。然而,如果初始化的是指向字符的指针(如上文的 char *str = “Hello, World!”;),则指针指向的字符串常量内容仍然是不可修改的。
固定长度字符串数组定义
这种定义方式称为不完全类型【在后续初始化或分配内存时指定的】
char list[][11] = {
"a 1 2 ",
"g 3 4 "
};
数组的每个元素是一个包含11个字符的字符数组,但不知道整个二维数组有多少行。
(char (*)[11]) 表示 指向数组的指针;
void test(){
// 定义一个二维字符数组并初始化
char list[][11] = {
"a 1 2 ",
"g 3 4 "
};
// list 是一个 指向二维字符数组的指针
// 它本身不是指针,但它可以被视为一个指向其第一行(char[11])的指针
// [在大多数上下文中,当你传递二维数组给函数时,它实际上会退化为指向其第一行的指针)]
// 这个“退化”的指针并不是一个 char** 类型的指针。
//char** 是一个指向指针的指针,它通常用于指向一个指针数组,
// 其中每个指针又指向一个字符串。
// char** p = doinglist;//
//指向字符数组的指针
char (*p)[11] = list;
// 打印数组中的字符串
printf("%s\n", list[0]);
printf("%s\n", list[1]);
printf("%s\n", p[0]);
printf("%s\n", p[1]);
// 修改数组中的字符串内容(可选)
strcpy(list[0], "b 2 3 ");
// 再次打印以验证修改
printf("%s\n", list[0]);
printf("%s\n", list[1]);
}