C++中char *和char []的区别

以前一直觉得这两个有区别,但也没深究,今天写了个代码报了警告于是就看了看,总结如下。


例如如下代码:

#include<iostream>
using namespace std;
int main()
{
    char *p1 = "abcd";
    char p2[] = "1234";
    return 0;
}

这二者的区别还在于:
1. p1是一个指针变量,有一块内存存储它,它的内容是字符串的地址,那么我们要访问字符串就先要取出p1中存储的地址,然后计算偏移量,进行访问
2. 不同于p1,p2直接是字符串的地址,直接访问就行了

“abcd”是文字常量区分配了内存存储的,栈上分配一地址给p1并指向“abcd”,那么如果在后面的代码中改变了“abcd”,自然崩溃。所以,需要加上const限定

但是说到底,为什么改变p1就是危险的,字符数组的内容就能随意改变呢?这是因为“abcd”是在编译时刻就确定的,而“1234”是在运行时刻赋值的。所以,编译器在编译时就已经知道p1指向的是常量,他并不希望你改变,但是数组不同,可以说他只是个存储的工具,编译器编译时并不知道它里面是什么。

但在往后的存取中,在栈上的数组比指针所指向的字符串是要快的。

还网上找到如下代码,很详细

int a=0;    //全局初始化区
char *p1; //全局未初始化区
main()
{
     int b;                  //栈
     char s[]="abc";  //栈
     char *p2;           //栈
     char *p3="123456";   //123456\0在常量区,p3在栈上。
     static int c=0;     //全局(静态)初始化区
     p2 = (char*)malloc(20);   //分配得来得10和20字节的区域就在堆区。
     strcpy(p1,"123456");   //123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。
 }
  • 26
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值