C语言中const char* 和char* const等常量的正确理解

本文详细解析了C++中const修饰符的各种用法及意义,帮助读者理解const如何作用于指针及其所指向的数据,避免编程时出现混淆。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不经常使用const的话,看过多少次都会忘记。让人很是郁闷!今天总结一下,找出规律便于以后记忆。

const char *p; //*p是const,p可变:const 后面紧跟的是char,所以*p是一个char字符,不可变

const (char *) p;//p是const,*p可变:const 后面紧跟的是(char *)这个整体,所以p是char*类型,不可变。

char* const p; //p是const,*p可变:const 后面紧跟的是p,所以p不可变

const char* const p; //p和*p都是const:第一个const后面紧跟的是char,所以char类型的字符*p不可变;第二个const后面紧跟的是p,所以p不可变。

char const * p;// *p是const,p可变:const后面紧跟的是*,但是单独的*不能表明修饰的内容,所以将*p看成一个整体,所以const修饰的是*p,*p不可变。

(char*) const p;//p是const,*p可变:const紧跟的是p,所以p不可变。

char* const p;// p是const,*p可变:const紧跟的是p,所以p不可变。

char const* const p;// p和*p都是const:第一个const紧跟的是*,不能表明修饰的内容,将后面整体的(* const p)看成一个整体,那就说明*p不可变,第二个const后面紧跟的是p,所以p不可变。

### 定义 `const char *` 类型的常量数组 在 C 语言中,可以创建一个指向多个字符串字面量(即字符串常量)的指针数组。这些字符串字面量本身是不可修改的字符序列,因此适合使用 `const char *` 来声明。 #### 使用一维数组的方式定义: ```c #include <stdio.h> int main() { // 声明并初始化一个包含三个字符串的 const char* 数组 const char *fruits[] = {"Apple", "Banana", "Cherry"}; for (size_t i = 0; i < sizeof(fruits)/sizeof(fruits[0]); ++i) { printf("%s\n", fruits[i]); } return 0; } ``` 上述代码展示了如何通过初始化列表来设置每个元素为不同的字符串字面量[^1]。这里需要注意的是,虽然可以通过这种方式访问各个字符串的内容,但是不能改变任何被指向的数据,因为它们都是只读的。 如果希望整个数组也是常量,则可以在最外层加上额外的关键字 `const`: ```c // 将整个数组设为常量, 不允许更改其中任何一个指针所指向的位置 static const char * const fruitNames[] = {"Mango", "Orange", "Peach"}; ``` 这样不仅使得每一个单独的字符串成为只读状态,而且也防止了重新分配新的地址给这些指针成员[^2]。 对于多维情况下的实现方法如下所示: #### 多维情况下定义: 当涉及到二维或多维结构时,通常会考虑嵌套一层或多层的一维数组形式。下面是一个简单的例子展示了一个两行三列的矩阵形布局下存储不同水果名称的方法: ```c #include <stdio.h> int main(){ // 创建一个多维数组,每一行代表一组关联数据 static const char * const matrix[][3]={ {"Red","Green","Yellow"}, {"Apple","Grape","Lemon"} }; size_t rows=sizeof(matrix)/sizeof(*matrix); size_t cols=sizeof(matrix[0])/sizeof(**matrix); for(size_t row=0 ;row<rows;++row){ for(size_t col=0;col<cols;++col){ printf("[%zu][%zu]=%s ",row,col,matrix[row][col]); } putchar('\n'); } return 0; } ``` 这段程序构建了一个由两个子数组组成的父级数组,每个子数组都包含了三个固定不变的字符串指针。这有助于保持良好的组织性可维护性的同时确保安全性[^3]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值