char数组和指针问题

2023-05-16

这个问题是C++基础问题中相当折腾人的一个,死记硬背解决不了根本问题,记住还是要忘,需要仔细研究其本质。

这两种方式就是数组和指针的方式:

char a[6] = "abcde";
char *b = "abcde";

第一行声明了并初始化了一个char数组,第二行是声明char指针b,指向了常量字符串。其中a是数组的首地址,a和b的地址一定不同。

千万不能说数组名是指针,可以用sizeof来否定:

char a[]="abcde";
cout<<sizeof(a)<<endl;

如果a是个指针,那么结果是4,但结果是6.

数组不能被直接复制,所以当数组名作为函数参数的时候,要么就是数组的引用,要么就是指向第一个元素的指针,他们的值是相等的。当你对一个数组做&的时候,他提取的是指向数组的指针,然后仍然可以隐式转换成指向第一个元素的指针,而且它们的值是相等的。

这样的代码是错的:

char a[6] = "abcde";
a[6] = "asdfge";

只有声明里才能用a[6],这就好比int a[6]={1,2,3,4,5,6};,但不能再用a[6]={5,6,7,8,9,0};。应该用a[0]='A';

这样的代码是正确的:

char a[]="abcde";
char *b;
b = a;

b是指针变量,指向了数组的首地址。

这样是错的:

char *a="abcde";  或者  char a[]="abcde";
char b[6];
b = a;

实际上是上一种情况的相反,报错error: incompatible types in assignment of 'char*' to 'char [6]'因为不存在一个隐式转换使得 char* 被转换成 char[]。这个问题比较关键,我们可以把数组名b理解成一个常量指针,它不能指向其他地址,但指向的字符串可以改变。但是注意只是这么理解而已,数组名并不真的是常量指针。同样的,b++;也是错的。
从另一个角度来看,数组名做函数参数时会退化为指针,这里没有退化为指针的条件,所以b不能当指针变量用。

这样也是错的:

char a[6];
a = "abcde";

a是数组的首地址,怎么把字符串常量赋给它?

再看这种情况:

char *a, *b;
a = "abcde"; 
b = "abcde";

a和b的值不一定相同,也就是不一定是同一个地址,这取决于编译器的行为。

对于char指针和数组,以下操作都是可行的。

const char* p="abcd";   //在常量区,应当加const,否则编译器会报警
// char  p[]="abcd";    // 在stack
cout<<p<<endl;      // abcd
cout<<&(*p)<<endl;  //abcd
cout<<*p<<endl;     // a
cout<<&p<<endl;     // 0x62fe9c

cout<<p+2<<endl;    //cd
cout<<*(p+2)<<endl;  //c
cout<<*p+2<<endl;   //99
cout<<p[2]<<endl;   //c

但下面操作仅适用于char数组,不能用于指针,指针指向的是常量:

//p[0]='A';

对于数组char p[]="abcd";,可以使用p[2],这是因为数组名在这里退化为指针,p转为指向数组首元素的char*类型。也就是说指针本身就可以用[],反而是数组名需要先转换为指针才能用[]。看下面的例子:

int b[5] = {1,2,3,4,5};
int *f=b;
cout<<f[2]<<endl;   // 3
f[2]=0;
cout<<f[2]<<endl;   // 0
cout<<b[2]<<endl;   // 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

char数组和指针问题 的相关文章

随机推荐

  • Nginx: Connection reset by peer 错误定位

    最近Nginx反向代理遇到了 104 Connection reset by peer 错误 xff0c google了一下 xff0c 这里记录一下 本文根据众多互联网博客内容整理后形成 xff0c 引用内容的版权归原始作者所有 xff0
  • 企业各职位英文缩写 PM,TM,PL,TL,SE,PG,CEO,CFO

    企业各职位英文缩写 xff1a GM General Manager 总经理 VP Vice President 副总裁 FVP First Vice President 第一副总裁 AVP Assistant Vice President
  • go mod常用命令 以及 常见问题

    最近接触到go mod xff0c 网上查了查资料 xff0c 这里记录一下 1 介绍 1 1 go mod是什么 go mod 是Golang 1 11 版本引入的官方包 xff08 package xff09 依赖管理工具 xff0c
  • 什么是CURL,PHP与CURL

    一 什么是CURL curl是一个利用URL语法在命令行方式下工作的文件传输工具 curl是一个利用URL语法在命令行方式下工作的文件传输工具 它支持很多协议 xff1a FTP FTPS HTTP HTTPS GOPHER TELNET
  • 大端小端字节序,网络字节序,Intel字节序

    一 字节序 计算机硬件存储数据有两种方式 xff1a 大端字节序 xff08 big endian xff09 和小端字节序 xff08 little endian xff09 小端字节序 xff1a 即低地址存低位字节 xff0c 或者说
  • 基于C++的Qt(三)Qt类库概述

    Qt是一个用标准C 43 43 编写的跨平台开发类库 xff0c 它对标准C 43 43 进行了扩展 xff0c 引入了元对象系统 信号与槽 属性等特性 xff0c 使应用程序的开发变得更高效 Qt类库中大量的类以模块形式分类组织的 xff
  • 【ROS2】一、创建工作空间和功能包

    文章目录 前言一 创建工作空间二 创建功能包三 编译功能包总结 前言 ROS2通过命令创建工作空间和功能包 xff0c vscode对ROS2的支持比ROS1少 xff0c 不能直接在vscode中创建功能包 xff0c 因此 xff0c
  • debian 更换源 使用国内源 配置方法

    配置前请先参考 xff1a https wiki debian org SourcesList https www debian org mirror list https mirrors tuna tsinghua edu cn help
  • i.MX6ULL 开发板-Mqtt 移植

    转载 xff1a http e betheme net article show 149636 html action 61 onClick PS xff1a 订阅主题 xff0c 命令如下 xff1a mosquitto sub h lo
  • echo web框架教程

    转载 xff1a https www cnblogs com remixnameless p 14318145 html 一 介绍 echo web框架是go语言开发的一种高性能 xff0c 可扩展 xff0c 轻量级的web框架 echo
  • open cv中cmake编译出现Download: opencv_ffmpeg.dll、ippicv等失败的解决方法

    转载 xff1a https blog csdn net qq 43237769 article details 128010340 问题原因 xff1a CMake opencv时无法连接服务器 xff0c 导致下载 ffmpeg dll
  • 正态分布(Normal distribution)又名高斯分布(Gaussian distribution)

    正态分布 xff08 Normal distribution xff09 又名高斯分布 xff08 Gaussian distribution xff09 xff0c 是一个在数学 物理及工程等领域都非常重要的概率分布 xff0c 在统计学
  • OpenCV图像拼接和图像融合技术

    转自 xff1a https www cnblogs com skyfsm p 7411961 html 图像拼接在实际的应用场景很广 xff0c 比如无人机航拍 xff0c 遥感图像等等 xff0c 图像拼接是进一步做图像理解基础步骤 x
  • 如何将pandas.dataframe的数据写入到文件中

    导入实验常用的python包 如图2所示 import pandas as pd pandas用来做数据处理 import numpy as np numpy用来做高维度矩阵运算 import matplotlib pyplot as pl
  • 八度音阶和频率的关系

    转载 xff1a http www cnblogs com cute archive 2013 02 28 2937222 html 八度音阶和频率的关系 Frequency in hertz semitones above or belo
  • 解决MATLAB不能设置为.m文件默认打开方式

    转载 xff1a https blog csdn net yujiaerzong article details 77624167 1 将下面代码复制保存为 associateFiles m 文件 2 在MATLAB中运行 associat
  • python中的wx模块

    转载 xff1a http www cnblogs com fnng archive 2013 05 23 3094033 html wx包中的方法都是以大写字母开头的 xff0c 而这和Python的习惯是相反的 本节介绍如何创建pyth
  • Postman安装(汉化Postman)

    Postman安装 汉化Postman 一 下载Postman 下载地址 xff1a https www postman com downloads 二 下载汉化包 下载地址 xff1a https github com hlmd Post
  • linux下vscode调试C++

    linux下vscode调试C 43 43 1 在CMakelists中设置编译为Debug模式 xff0c 增加需要生成的可执行程序 set CMAKE BUILD TYPE DEBUG add executable hello main
  • char数组和指针问题

    这个问题是C 43 43 基础问题中相当折腾人的一个 xff0c 死记硬背解决不了根本问题 xff0c 记住还是要忘 xff0c 需要仔细研究其本质 这两种方式就是数组和指针的方式 xff1a span class hljs keyword