C++中char *和char []的区别
发布日期:2021-09-12 06:44:48
浏览次数:2
分类:技术文章
本文共 885 字,大约阅读时间需要 2 分钟。
以前一直觉得这两个有区别,但也没深究,今天写了个代码报了警告于是就看了看,总结如下。
例如如下代码:
#includeusing 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秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
牛客 奇怪的排序问题(单调栈/遍历)
2019-04-28
牛客 XOR和(找规律)
2019-04-28
天池 在线编程 数组划分III(计数)
2019-04-28
天池 在线编程 最小振幅(排序)
2019-04-28
天池 在线编程 高效作业处理服务(01背包DP)
2019-04-28
LeetCode 1694. 重新格式化电话号码(模拟)
2019-04-28
LeetCode 1695. 删除子数组的最大得分(前缀和+哈希+双指针)
2019-04-28
LeetCode 1696. 跳跃游戏 VI(优先队列 / 单调队列)
2019-04-28
LeetCode 1697. 检查边长度限制的路径是否存在(排序+并查集)
2019-04-28
牛客 牛牛浇树(差分)
2019-04-28
牛客 挑选方案问题(排列组合)
2019-04-28
牛客 统计好元组
2019-04-28
牛客 共鸣问题(思维难题)
2019-04-28
Pytorch 张量tensor
2019-04-28
Pytorch 自动微分
2019-04-28
Pytorch 神经网络训练过程
2019-04-28
LeetCode 1716. 计算力扣银行的钱(等差数列)
2019-04-28
LeetCode 1717. 删除子字符串的最大得分
2019-04-28
LeetCode 1720. 解码异或后的数组(位运算)
2019-04-28
LeetCode 1721. 交换链表中的节点(快慢指针)
2019-04-28