char数组与char指针的区别与联系

2023-05-16

字符串(char*)与字符数组(char[])区别
在C语言中,对字符串的操作主要有两种方式:一是字符数组(char[]),二是使用字符指针(char*)。接下来最这两种所使用的情况做彻底的说明:
一、字符数组
字符数组的定义有两种方式:
1.char s[n];
n表示数据的大小。该语句可以理解为 声明一个字符数组,并且编译器为该字符数组分配n个内存空间,这是在编译期进行的。
赋值有两种方式:
(1)声明并初始化
char s[10]="hello,world";//使用字符串字面值(string literal)来初始化字符数组
(2)已经分配了内存,然后进行赋值。
char s[10];
s[0]='h',s[1]='e';
错误的赋值方式:
(1)char s[];
s = "hello,world";
//这表明仅仅声明了一个char数组,但是不知道分配多大内存空间。
(2)char s[10];
s = "hello,world";//错误
s={'h','e','l','l','o'};//错误 s是指向数组首地址的指针。
二、字符指针
可以使用char *str指向一个字符串如:
char* str="C++";//声明一个指向char的指针并进行初始化。
char* str;//声明一个指针。
str ="C++";
三、两者的区别
1. 既然 char *a 只是定义了一个指针 a,而并不为其指向的字符串分配内存,那么为什么下面两行代码又能够编译通过,且执行结果看上去是正常的?
char *a;
a = "abcde";
这两行程序的执行过程中,编译器/计算机都做了些什么?
在这两行程序的基础上,为什么赋值语句 *a = 'A' 又是不合法的(会导致运行时错误)?
相比于上面两行程序,以下两行也是不合法的,为什么?
char a[];
a = "abcde";
答:(1)char *a; 这一行中编译器做的事情是,声明一个指向字符的指针,但是没有让该指针分配指向内存,它只是知道有一个变量 a 可能需要放在栈上;
假如后面需要取变量 a 的地址,那么编译器就被迫使 a 占用栈空间.而假如编译器决定使 a 不占用栈空间就要给 a 在它需要保持值的期间保留一个
寄存器, 在执行时计算机不为此做任何事情。
(2)a = "abcde"; //这一行中编译器做的事情是在字符常量内存空间定义一个"abcde"字符串,让字符指针a指向此字符常量内存空间的地址。由于该地址空间
不是在栈内,而存在类似于静态存储区这样的空间。
(3)*a = 'A' 之所以会在运行时发发生错误,是因为匿名数组所在的存储空间是不可写的。
(4)char a[];
a = "abcde";//以上是不合法的。首先,声明数组时如果没有给变量初始化就必须指明数组的长度。
其次,即使改成char a[6];a = "abcde";也是不合法的,这是因为你不能将指针值赋给一个数组。
或者用一个更简单的说法:类型不同,并且不存在一个隐式转换使得 char* 被转换成 char[6] 。
2. 以下两种初始化方式是否有本质区别?
char a[] = "abcde";
char *b = "abcde";
答:从效果上来说,上面两个语句结果是一样的,都获取到字符的首地址。但是本质是不一样的,char 数组的初始化器会先为该数组在栈内分配内存,
然后将匿名数组的内容复制到对象所处的空间中char* 的初始化器会首先在字符串常量空间内存生成一个常量字符串"abcde",然后将该字符串的首地址
赋值给字符指针对象。
3. 为什么下面的代码
char *a, *b;
a = "abcde"; b = "abcde";
其运行结果中, a 和 b 会指向同一内存地址?而上一问中得到的 a 和 b 就不会指向同一内存地址。
答:不一定一样,这取决于编译器。
4. 对于数组声明(或初始化)的变量,例如
char a[6];

char a[]="abcde";
这句话是否正确?当 a 作为右值(rvalue)时,其类型为 char*;而当 a 作为左值(lvalue)时,其类型就是 char[6]。
答:这句话是错误的。从 char[6] 到 char* 有一个隐式转换,这并不意味着 a 会有飘忽不定的类型。
我有这个疑问,是因为我试过几次,发现以下代码可以正常运行
char a[]="abcde";
char *b;
b = a;
答:可以从char[]隐式转换为char* 类型,但是不可以从char*类型转换到char[]类型。
而以下代码会导致类型转换错误
char *a="abcde";
char b[6];
b = a;
甚至,以下代码也会导致类型转换错误,且错误提示和上一段代码是一样的
char a[]="abcde";
char b[6];
b = a;
5.对于函数参数中的char[]和char*是否一样?
答:在C语言中,数组作为参数,进行传递时,传递的是指针 ,换句话说,字符数组作为参数,进行传递时,
传递的是字符数组的起始地址,相当于一个字符指针,两者没有区别。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

char数组与char指针的区别与联系 的相关文章

随机推荐

  • 使用proguard进行javaweb代码混淆

    背景 xff1a 公司需要将软件打包出售 xff0c 此时需要进行代码混淆和一些加密要求 调研 xff1a 目前此类实现包含软件和硬件实现 xff1b 硬件实现是使用类似加密狗usb工具进行防护 xff0c 应用系统通过与加密狗交互 xff
  • 使用说明-Postman-带cookie请求、文件上传

    Postman进行文件上传 选择post方式 xff0c 地址是http 192 168 102 213 7240 foa system upload Headers部分不要填写任何内容 对照后台的接口 xff0c 配置postman 选择
  • CentOS7下使用docker,完成Jenkins镜像、tomcat镜像制作和启动

    最终的目的 xff0c 是为了完成docker环境的Jenkins搭建使用 xff0c 并从gitlab上获取代码 xff0c 打出war包 xff0c war包通过目录挂载的方式 xff0c 在tomcat容器中使用 xff0c 总体思路
  • C# HttpWeb POST请求封装

    用于发送POST请求 xff0c 可以发送各种POST参数 传送文件 xff0c 返回结果 下载文件 说明如下 xff1a span class hljs keyword public span span class hljs keywor
  • [ROS学习笔记]ROS中使用激光雷达(RPLIDAR)

    RPLIDAR是低成本的二维雷达解决方案 xff0c 由SlamTec公司的RoboPeak团队开发 xff0c 本次学习用的是RPLidar A1型号激光雷达 xff0c 它能扫描360 xff0c 6米半径的范围它适合用于构建地图 xf
  • Ubuntu 18.04 配置国内源

    安装Ubuntu 18 04后 xff0c 使用国外源太慢了 xff0c 修改为国内源会快很多 修改阿里源为Ubuntu 18 04默认的源 备份 etc apt sources list 备份 cp etc apt sources lis
  • VS2010 断点失效解决方案 (VC)

    遇到几次断点失效的问题 xff0c 下面的方法都用了一下 xff0c 不清楚是哪个方法起作用了 一 菜单 调试 选项和设置 调试 常规 要求源文件与原始版本完全匹配 取消这个功能 二 菜单 编辑 高级 设置选定内容的格式 把打不上断点的那个
  • stm32学习

    波特率 xff1a 每秒传送的位数 DMA Direct Memory Access xff0c 直接内存存取 是所有现代电脑的重要特色 xff0c 它允许不同速度的硬件装置来沟通 xff0c 而不需要依赖于 CPU 的大量中断负载 否则
  • 经纬高坐标系转到东北天坐标系

    经纬高坐标系转到东北天坐标系 基本思路 xff1a 首先把经纬高 xff08 大地坐标系 lla llh xff09 转到直角坐标系 xff08 地心地固直角坐标系 xff08 ECEF xff09 xyz xff09 然后再转为局部坐标系
  • Ubuntu20.04 配置D435i相机

    文章目录 一 安装使用 InterRealSenseD435i SDK21 注册服务器的公钥2 安装3 安装开发者和调试包4 测试SDK2 二 安装realsense ros1 创建工作空间2 源码安装3 编译 xff1a 三 安装kali
  • java打卡-day3 变量和数据类型

    变量和数据类型 基本数据类型分类 4类8种 整数型 byte 占一个字节 128到127short 占两个字 215 215 1int 占四个字节 231 231 1long 占八个字节 263 263 1 浮点型float 占四个字节 3
  • 【行人惯性导航】关于行人导航中IMU位姿推导的知识点及相关代码

    IMU姿态惯性推导 本文是我上学期间写得 xff0c 之前已经在另一个博客发布过 xff0c 如今转至此发布 最近从事行人惯性导航的研究 xff0c 本人也是一个小白 xff0c 其中看了很多文献 xff0c 有很多个人思考很费时间的地方
  • nuttx操作系统的移植以及下载

    1 在ubuntu根目录下 xff1a root 64 ubuntu apt get update 更新包 2 root 64 ubuntu apt get install gcc arm none eabi 编译器 3 kconfig f
  • MPI集群环境搭建

    我在前面两篇博客中简要介绍了为什么要并行计算以及MPI的一些学习心得 xff0c 接下来我们正式开始MPI的学习之路 我们知道MPI是分布式内存编程 xff0c 所以这篇博客会详细讲解MPI集群环境的搭建过程 一 准备工作 选择Linux版
  • python 练习 tcp 服务器与客户端发、接信息,pycharm

    背景 win8 1 pycharm 2021 3 1 python 3 9 7 自带idle vs code 1 64 2 现象 1 代码不知道如何在idle 和 vs code中运行 xff0c 总是在运行客户端代码后 已先运行服务器代码
  • VSCode配置终端为cmd命令行程序的操作步骤

    步骤1 xff1a 依次点击菜单栏的 终端 新建终端 步骤2 xff1a 按图中红色箭头的方向和方框所示 xff0c 依次点击 步骤3 xff1a 点击图中红框处的command product xff0c 下次再启动时的VSCode终端就
  • VC/C++ 发送post请求

    前面我搭建了一个servlet xff0c 响应get post请求 xff0c 网页端已经实现get post请求 xff0c 这个时候我用c 43 43 编辑的程序也想发送post请求 xff0c 于是 xff0c 有了下面这段代码 s
  • Python subprocess模块解析

    在学习这个模块前 xff0c 我们先用Python的help 函数查看一下subprocess模块是干嘛的 xff1a DESCRIPTION This span class hljs keyword module span allows
  • Java与C/C++的性能对比

    写这个主题是因为若干时间前一时头脑发热 xff0c 写了这个帖子 xff08 http www iteye com topic 857722 xff09 xff0c 现在看来这个帖子很幼稚 xff0c 尤其是二楼 61 61 xff0c 后
  • char数组与char指针的区别与联系

    字符串 xff08 char xff09 与字符数组 xff08 char 区别 在C语言中 xff0c 对字符串的操作主要有两种方式 xff1a 一是字符数组 char xff0c 二是使用字符指针 char 接下来最这两种所使用的情况做