当前位置: 首页 > article >正文

char*与char[]的区别

之前在给函数传形参时,char*和char[]我是混着用的,当时感觉它俩用起来没啥差别,就草率地把它俩混为一谈。

但实际上,这俩本质是不同的,只是在作为形参的时候可以互换使用。我这篇博客就是来记录下它俩的区别。

现在我定义出指针p和字符数组arr:

int main()
{
    char* p = "abc";
    char arr[] = "111";
    return 0;
}

p和arr的不同

p和arr有着本质的不同。

p是变量,用于存放地址的,开在栈区。变量的值是可以改变的,我们通过改变p中的地址,来改变指针的指向。

arr是常量,是数组首元素的地址,存放在静态区。常量是无法改变的!

"abc"和"111"的不同

这俩字符串本质也是不同的。

"abc"是常量字符串,是无法修改的。其实我们这样写char* p = "abc";在很多编译器下会报错,因为"abc"是const char*类型的常量字符串,当前的写法存在类型不匹配的问题,正确的写法应该是const char * p = "abc";。

"111"是变量,是栈区中的一块数组空间,111是被写进这个空间里的。此空间可读可写。

为什么"abc"和"111"在本质上会有这么大差别呢?答案是天生如此。也就是说,char*与char[]在初始化的时候,就是完全不同的。

char* p = "abc";的初始化:

1.在静态区上申请一块空间,存放字符串常量"abc"

2.在栈区上为指针变量p开空间。

3.把"abc"的地址存进p里。OK,现在p就是指向常量了,当然,p本身是可以改变指向的。

char arr[] = "111";的初始化:

1.在栈区上为数组变量开空间

2.将常量”111“的内容拷贝到数组变量里去

3.因为数组是连续存储的空间,要想找到它就只需知道首元素的地址。把首元素的地址赋给常量arr。


http://www.kler.cn/news/136838.html

相关文章:

  • 文案创作新思路:Python与文心一言API的完美结合
  • Flutter 12 实现双击屏幕显示点赞爱心多种动画(AnimationIcon)效果
  • vue中选项式 API(Options API) 和 组合式 API(Composition API)区别
  • sentinel原理源码分析系列(八)-熔断
  • LeetCode53:最大子数组和
  • 酒店预订订房小程序源码系统 多酒店入驻+打造类似美团的酒店模式 带完整的安装代码包以及搭建部署教程
  • SpringBoot整合Data JPA
  • 集合框架面试题
  • 微服务实战系列之Nacos
  • 如何在外部数据库中存储空间化表时使用Mapinfo_mapcatalog
  • 配置Java环境变量不生效的解决办法
  • el-date-picker ie模式下 初始化未赋值;未清空
  • 信安.网络安全.UDP协议拥塞
  • 数字化转型与企业创新—基于中国上市公司年报的经验证据(2007-2022年)
  • QT5 MSVC2017 64bit配置OpenCV4.5无需编译与示范程序
  • 快速解密PPT幻灯片密码,让PPT重见天日
  • 【C++心愿便利店】No.14---C++之探索list底层原理
  • Matlab群体智能优化算法之海象优化算法(WO)
  • 图像滤波处理
  • 企业微信将应用安装到工作台
  • LeetCode算法题解(动态规划)|LeetCoed62. 不同路径、LeetCode63. 不同路径 II
  • Go语言读取文件内容
  • 基于饥饿游戏算法优化概率神经网络PNN的分类预测 - 附代码
  • Threejs_08 纹理颜色的调整(颜色空间的设置)
  • 系列一、介绍
  • 【旅游行业】Axure旅游社交平台APP端原型图,攻略门票酒店民宿原型案例