C++中char* str与char str[]的区别

本文解析了C/C++中char*与char[]的区别,包括它们的存储位置、生命周期及使用场景。通过实例展示了指针与数组在函数返回时的行为差异。

昨天写程序,犯了一个比较幼稚的问题,就是混淆了char* str与char str[]的区分,经过代码test和查阅,终于弄明白了区别,在这里分享给大家这个区别和过程。在定义的时候,其实char* s1与char s2[]是有很大区别的。s1这个指针其实是指向一段常量字符串,存储在静态储存区,这段字符串是只读的,不能被修改。然而,s2这只是个局部变量数组,在定义它的时候,有两份备份,一份存储在stack上,一份存储在静态存储区,所以可以被修改。

举个例子,假如我定义了一个函数,返回的是char*的类型变量,当这个函数运行结束时,所定义的字符串在静态存储区,并不会消亡,当整个程序结束时,才会消亡。如下图所示,我有返回char*的str()函数。


如上图所示,我赋给的字符串值为“aaaa”,从而,这串aaaa也就存储在静态存储区上了。挡在main函数中调用这个函数的时候


输出结果是


结果没有任何问题,这说明,在str()函数运行结束时,字符串aaaa还是存在的。

这时,如果我们换一个函数,如下图:


在这个函数中,我定义了一个局部变量char数组,赋值依然是aaaa。在main函数中调用这个函数。


运行结果为:


我们从结果来看,所返回的指针为一串乱码,这是因为char s1[]定以后,在程序中有两份拷贝,一份在静态存储区中,一份在stack中,当str1()函数运行退出时,stack要被清空,从而内存也就被清空了,返回的是一个被释放的内存地址,所以打印出来也就是一段乱码了。

从上面的例子中可以得到两种指针的本质区别。另外还有一个例子可以验证。


在这个例子中,我定义了四个指针,两个char*指向同一个字符串,由于该字符串存储在静态储存空间里面,所以他们所指向的地址是一样的。同时我又定义了两个char[]类型的指针,他们两个也指向一串相同的字符串,由于这个字符串有备份,所以,s3和s4是不相同的。从下面运行结果,我们可以看出:


通过上面两个例子的讲解,我想大家对于char*和char[]数组定义的指针有了一定的了解,这虽然是个很小的问题,但是容易让很多人迷糊,涉及到变量空间的存储问题。另外,祝大家晚安,有个好梦,呵呵。


<think>我们正在讨论C/C++中的指针声明。用户的问题是关于`const char *str`中`*`符号的含义。 根据引用[1]和引用[3]: - `const char *str` 表示`str`是一个指针,它指向一个常量字符(或多个字符,即字符串)。 - 这里的`*`表示`str`是一个指针变量,它存储的是一个内存地址,该地址处存放的是`const char`类型的数据。 具体解释: - `const char *str` 可以拆分为两部分: 1. `const char`:表示指针指向的数据类型是常量字符,即不能通过该指针修改所指向的字符。 2. `*str`:这里的`*`是声明指针变量的符号,表示`str`是一个指针变量。 因此,`*`在声明中的含义是:声明一个指针变量,该指针指向`const char`类型。 注意:在声明语句中,`*`类型修饰符(如`const`)结合,表示指针的类型属性。而在表达式中,`*`作为一元运算符时,表示解引用操作,即获取指针所指向的值。 例如: - 声明:`const char *str;` // 这里的`*`表示`str`是一个指针 - 使用:`char c = *str;` // 这里的`*`是解引用,获取`str`指向的第一个字符 另外,引用[2]和引用[3]还提到了其他几种形式: - `char const *str`:`const char *str`相同,都是指向常量字符的指针(指针本身可以改变指向,但不能通过指针改变内容)。 - `char * const str`:这是一个常量指针,指针本身不能改变指向(即不能指向其他地址),但可以通过指针改变内容(如果内容不是常量的话)。 - `const char * const str`:指向常量字符的常量指针,既不能改变指向,也不能通过指针改变内容。 总结:在`const char *str`中,`*`的含义是声明`str`为一个指针变量,该指针指向`const char`类型的数据。 相关问题: 1. 在C语言中,指针声明中的`*`和解引用操作符`*`有什么区别? 2. `const char*`和`char*`在函数参数传递时有什么不同? 3. 如何理解指针的常量性和指向数据的常量性? 4. 在C++中,字符串字面量为什么通常用`const char*`来指向? 5. 如何避免在使用指针时意外修改只读内存区域?</think>在 `const char *str` 声明中,`*` 符号表示 **指针声明符**,其核心含义是:**`str` 是一个指针变量,用于存储内存地址**。具体解析如下: ### 1. `*` 的基础作用 - **声明指针**:`*` 表示 `str` 是一个指针变量,而非普通变量。 - **存储地址**:`str` 的值是一个内存地址(如字符串的首地址),而非直接存储字符数据。 - **间接访问**:通过 `*str` 可访问该地址指向的数据(解引用操作)。 ### 2. 结合 `const` 的语义 - **`const char *`** 的含义: - `const char`:指向的数据是常量字符(不可修改)。 - `*str`:`str` 是指向这些常量字符的指针。 - **关键限制**:不能通过 `str` 修改其指向的数据(如 `*str = 'a'` 非法)[^1][^3]。 ### 3. 其他指针声明的对比 | 声明形式 | 指针自身是否可变 | 指向内容是否可变 | 示例 | |------------------|------------------|------------------|--------------------| | `const char *str`| ✅ (可指向其他地址) | ❌ (内容只读) | `str++` 合法 | | `char *const str`| ❌ (固定地址) | ✅ (内容可修改) | `*str='a'` 合法 | | `const char *const str`| ❌ | ❌ | 两者均不可变 | ### 4. 实际应用示例 ```c const char *str = "Hello"; // str 指向字符串常量 printf("%c", *str); // 输出 'H'(解引用访问) str++; // 合法:指针指向下一个地址 'e' // *str = 'a'; // 非法:不能修改常量数据 ``` ### 总结 - `*` 在声明中:标识 `str` 为指针变量(存储地址)。 - `const char *`:强调指针指向的数据不可修改(但指针自身可指向其他地址)[^1][^2][^3]。 --- ### 相关问题 1. 为什么 `const char*` 常用于字符串字面量的声明? 2. 如何通过指针修改 `char *const` 指向的内容? 3. 在函数参数中,`const char**` 的使用场景是什么? 4. 如何避免因指针越界导致的未定义行为? 5. `const` 修饰符在指针声明中的位置如何影响语义?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值