C语言中,const 关键字的本质作用是什么?const char *point1、char *const point2、const char *const point3等的区别是什么?

在 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语言中本质上字符串都是一个指针嘛),这是表示字符串列表的结束(常见做法)。


小结

这段代码实际上在实现一个只读的字符串数组,它的特点是:

  1. 字符串内容不可修改。
  2. 指针本身不可修改。
  3. 数组是静态的,只能在文件内使用。
  4. NULL 作为结束标志,表示字符串列表结束。

如果还有疑问,可以继续深入讨论!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值