C++中char *和char []的区别
发布日期:2021-09-12 06:44:48 浏览次数:2 分类:技术文章

本文共 885 字,大约阅读时间需要 2 分钟。

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


例如如下代码:

#include
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"优化成一个地方。 }

转载地址:https://blog.csdn.net/weixin_36888577/article/details/78717684 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:快速排序
下一篇:三种继承、多态-虚函数

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月13日 04时47分28秒