在 C 语言中,const 关键字修饰变量或指针时,用于表示只读性,避免对变量或数据进行意外修改。
问:
在C语言中,const char *point1、char *const point2、const char *const point3、const char fontdata[100]的区别是什么?
在C语言中,const
关键字用于修饰变量或指针,表示该变量或指针的内容或指向的内容不能被修改。下面是对这三种情况的详细解释:
这四种声明在 C 语言中有不同的含义,主要体现在指针的可修改性和指针所指向内容的可修改性上。以下是详细解释:
1. const char *point1
- 意义:指针
point1
所指向的内容是 只读的,但指针本身可以修改。 - 解释:
- 你不能通过
point1
修改指针指向的内容。 - 但可以让
point1
指向其他地址。
- 你不能通过
- 代码示例:
const char *point1 = "hello"; // *point1 = 'H'; // 错误:不能修改指针指向的内容 point1 = "world"; // 合法:指针本身可以被修改
2. char *const point2
- 意义:指针
point2
是 常量,不能修改它所存储的地址,但可以修改指针指向的内容。 - 解释:
- 你不能让
point2
指向其他地址。 - 但可以通过
point2
修改它指向的内容。
- 你不能让
- 代码示例:
char str[] = "hello"; char *const point2 = str; *point2 = 'H'; // 合法:可以修改指针指向的内容 // point2 = str + 1; // 错误:不能修改指针本身
3. const char *const point3
- 意义:指针
point3
和指针所指向的内容都 不可修改。 - 解释:
- 你不能通过
point3
修改它指向的内容。 - 也不能让
point3
指向其他地址。
- 你不能通过
- 代码示例:
const char *const point3 = "hello"; // *point3 = 'H'; // 错误:不能修改指针指向的内容 // point3 = "world"; // 错误:不能修改指针本身
4. const char fontdata[100]
- 意义:这是一个大小为
100
的字符数组,数组中的每个元素都是 只读的。 - 解释:
- 数组中的内容不能修改。
- 数组的大小是固定的,不能改变。
- 代码示例:
const char fontdata[100] = "hello"; // fontdata[0] = 'H'; // 错误:不能修改数组内容
总结对比
声明 | 指针本身可修改 | 指针指向内容可修改 |
---|---|---|
const char *point1 | ✅ 可以修改 | ❌ 不可修改 |
char *const point2 | ❌ 不可修改 | ✅ 可以修改 |
const char *const point3 | ❌ 不可修改 | ❌ 不可修改 |
const char fontdata[100] | N/A(不是指针) | ❌ 不可修改 |
附一个复杂的实例:
static const char * const ts_name_default[] = {
"/dev/input/ts",
"/dev/input/touchscreen",
"/dev/touchscreen/ucb1x00",
NULL
};
这段代码确实涉及了指针、数组以及const
关键字的组合,乍一看可能比较复杂。让我们分解一下它的结构并逐步解释:
代码拆解与解释
static const char * const ts_name_default[] = {
"/dev/input/ts",
"/dev/input/touchscreen",
"/dev/touchscreen/ucb1x00",
NULL
};
1. static
static
修饰符表示这个变量的存储周期是静态的,生命周期从程序开始到程序结束。此外,这里的static
还意味着它的作用域被限制在定义它的文件中(即文件作用域)。其他文件无法直接访问ts_name_default
。
2. const
代码中有两个const
,分别修饰不同的内容:
-
const char *
:- 表示指向的字符串内容是只读的,即不能通过这个指针修改字符串的内容。
- 例如,不能对
"/dev/input/ts"
执行修改操作。
-
const ... * const
:- 第二个
const
修饰指针本身,表示指针的地址是只读的,不能修改指针使其指向其他地方。 - 即每个元素在数组中指向固定的字符串地址。
- 第二个
结合起来,const char * const
表示一个指向不可修改内容的不可修改指针。
3. 数组声明
ts_name_default[]
是一个数组,每个元素是 const char * const
类型的指针。这个数组是以 NULL
结尾的(NULL实际上是空指针,在C语言中本质上字符串都是一个指针嘛),这是表示字符串列表的结束(常见做法)。
小结
这段代码实际上在实现一个只读的字符串数组,它的特点是:
- 字符串内容不可修改。
- 指针本身不可修改。
- 数组是静态的,只能在文件内使用。
NULL
作为结束标志,表示字符串列表结束。
如果还有疑问,可以继续深入讨论!