char数组与char指针

2023-05-16

转载来源:
https://www.cnblogs.com/nzbbody/p/3553222.html
https://blog.csdn.net/jack_20/article/details/78913202

一、‘\0’的添加

存在的C语言方法,如strlen(s),计算字符串的长度,其中s指针。
strlen要计算字符串长度,必须知道哪里是结尾,因此使用\0表示结尾。
只有字符数组才有\0的概念,其它类型(int)的数组没有这个概念。

二、内存分配

数组可以在栈上分配,也可以在堆上分配,但必须指定大小。

char a1[100];                   //在栈上分配
char* pa = new char[100];       // 在堆上分配,返回首元素的地址

三、初始化

char str[10] = "Hello";
char str[10] = {'H','e','l','l','o','\0'};
char str[10] = {'H'};
char str[10] = {0};
char str[10] = "Hello, world.\n";
char str[] = "Hello, world.\n";

第一种情况:初始化数据小于数组长度
如前面两个初始化的例子,这两个例子的效果一样,前五个字符为Hello,剩余的用’\0’填充
第三行与第四行,都只指定了第一个字符,剩余的全部用’\0’填充。第四个例子相当将整个数组初始化为’\0’

第二种情况:初始化数据等于或超过数据长度
这种情况下,超出的部分将被丢弃,所以最五个例子的最后一个字符为’l’.
此时使用一些字符串函数时要特别注意,因为该数组不含有’\0’,会造成不可预期的结果

第三种情况:不指定数组长度
这种情况下,数组部分如果不含有明确指定的’\0’,那么编译时会被自动添加一个’\0’;
在数组不含有明确的’\0’时,sizeof=strlen+1

四、结果输出

char a1[] = “abc”; 下面的结果分别是什么?
输出相同,都是数组元素的第一个地址。

cout << &a1[0] << endl;
cout << a1 << endl;

char* pa = “abc”; 下面的结果分别是什么?
第一行输出pa在栈上的地址,第二行和第三行输出相同,都是首地址。
pa是指针,就是指向首个元素的地址。

cout << &pa << endl;
cout << &pa[0] << endl;
cout << pa << endl;

下面的结果,违反直觉,按道理第4行,第5行应该输出地址。但是却输出指向的字符串。这有一定的合理性,我们打印char指针,往往是要看指向的内容,而不是要看地址是多少。而且cout很容易做到,只要遇到\0就结束。那么问题来了,我想看地址怎么办?使用int强制转化为地址。

char a1[] = "abc";
char* pa = "def";
cout << a1 << endl;          // 输出abc
cout << pa << endl;          // 输出def
cout << (int)a1 << endl;     // 输出a1地址
cout << (int)pa << endl;     // 输出pa地址

除此之外,还可以用“ * ”来获取单个字符

char* pa = abcde;
cout << *pa << endl;          //输出a
cout << *(pa+2) <<endl;       //输出c

五、获取长度

char p[] = "abcde";
char* p2 = "abcde";

cout << sizeof(p) << endl; //数组大小为6
cout << sizeof(p2) << endl; // 指针大小为4

cout << strlen(p) << endl; // 长度为5
cout << strlen(p2) << endl; // 长度为5

六、常用函数

#incldue <string.h>

//将已开辟内存空间 s 的首 n 个字节的值设为值 c。
void *memset(void *s,int c,size_t n);

//统计给定字符串的长度
size_t strlen(const char *s);

//拷贝src前n个字节到dest上
//当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证。
void *memcpy(void *dest,const void *src,size_t n);
void *memmove(void *dest,const void *src,size_t n);

//拷贝src字符串到dest上(会复制结束符)
//strcpy只用于字符串拷贝,而memcpy可用于各种类型
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src,size_t n);

//把src所指字符串(前n个字节)添加到dest结尾处。
char *strcat(char *dest,const char *src);
char *strncat(char *desk,const char *src,size_t n);

//比较前n个字符大小,大小写敏感
//strcmp检查到'\0'则终止比较
//memcmp对特殊情况处理更好,效率更高
int memcmp(const void *s1,const void *s2,size_t n);
int strcmp(const char *s1,const char *s2);
int strncmp(const char *s1,const char *s2,size_t n);

//比较前n个字符大小,大小写不敏感
int strcasecmp(const char *s1,const char *s2);
int strncasecmp(const char *s1,const char *s2,size_t n);

//strchr找出str字符串中第一次出现c的地址,返回该地址
//strrchr找出str字符串中最后一次出现c的地址,返回该地址
//strstr找出在haystack字符串中第一次出现needle字符串的位置
char *strchr(const char *s,int c);
char *strrchr(const char *s,int c);
char *strstr(const char *haystack,const char *needle);

//strtok在str中有delim字符的位置处分割字符串
//strtok_r是linux下分割字符的安全函数,将剩余字符串保存在saveptr中
char *strtok(char *str,const char *delim);
char *strtok_r(char *str,const char *delim,char **saveptr);

七、相互转换

请参考:C++中string、char *、char[]相互转换
https://blog.csdn.net/qq_30534935/article/details/82459448

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

char数组与char指针 的相关文章

  • 跟踪 malloc 分配了多少内存

    在快速浏览了 SO 上的相关问题后 我推断没有函数可以检查 malloc 分配给指针的内存量 我正在尝试使用 C 中的简单 char 来复制一些 std string 基本功能 主要是动态大小 并且不想一直调用 realloc 我想我需要跟
  • 将字符转换为键

    我有一个特殊的字符 我想将其转换为键 我目前正在使用这个 Keys k Keys 在调试时 我发现 k 等于 L按钮 R按钮 M按钮 返回 空间类型 System Windows Forms Keys k 的键码应该是 111 注意 该代码
  • 如何在 Python 中将字符转换为整数,反之亦然?

    我想得到 给定一个角色 它ASCII value 例如 对于角色a 我想得到97 反之亦然 Use chr http docs python org library functions html chr and ord http docs
  • 如何在perl中将十六进制转换为字符字符串

    我需要将 xx 十六进制字符更改为字符 我正在尝试使用此代码 但它不起作用 usr bin perl w my cadena 40 61 62 print cadena n cadena s g print cad cadena n my
  • 如何将此代码转换为使用字符串

    char recursivecombo char str int choices int level int len strlen str level if level choices for int i 0 i lt len 2 i pr
  • 将字母转换为数字[重复]

    这个问题在这里已经有答案了 我是 matlab 新手 我只是想将字母转换为数字 这样 A 1 B 2 C 3 我所有的数字都是大写的 当然 我可以为每个字符定义常量 但是有更短的方法吗 Thanks See the char功能 您可以给它
  • 如何检查字符串是否包含从a到z的任何字母? [复制]

    这个问题在这里已经有答案了 可能的重复 C 正则表达式 检查 a z 和 A Z https stackoverflow com questions 6017778 c sharp regex checking for a z and a
  • C 字符值算术

    我一直在阅读 C 编程语言 一书来学习 C 我偶然发现了算术s i 0 他们说它给出了存储在 s i 中的字符的数值 我不太明白 它怎么能通过减法给出值呢 注意 这用在 atoi 函数中 该函数将数字字符串转换为其等价的数字 谢谢 可能重复
  • 结构中的字符数组 - 不兼容的赋值? [复制]

    这个问题在这里已经有答案了 我试图找出结构真正的 是什么 并遇到了问题 所以我有两个问题 1 sara 中保存了什么 它是指向结构体第一个元素的指针吗 2 更有趣的问题 为什么它不能编译 GCC 说 test c 10 错误 赋值中的类型不
  • 将 int(32 位)转换为 char(8 位)

    我有这些定义 int data uartBaseAddress UART DATA REGISTER 4 data coming from UART RX port char message 20 array of 20 chars 现在当
  • ChrW(e.KeyCode) 在 C# 中的等价物是什么?

    在VB NET 2008中 我使用了以下语句 MyKeyChr ChrW e KeyCode 现在我想将上面的语句转换成C 有任何想法吗 快速而肮脏的相当于ChrW在 C 中只是将值转换为char char MyKeyChr char e
  • 字符数组的初始值设定项字符串太长

    我不断收到此错误 字符数组的初始化字符串太长 即使我将 num 和 length 更改为 1 它仍然会出现错误 include
  • char * 变量地址与 char[] 变量地址

    我从以下两个声明和初始化中打印出地址和字符串 char strPtr char This is a string made on the fly char charArray Chars in a char array variable 打
  • 如何清空字符数组?

    有一个像 char Members 255 这样的字符数组 如何在不使用循环的情况下完全清空它 char members 255 我所说的 空 是指如果它存储了一些值 那么它就不应该 例如 如果我执行 strcat 那么旧值不应保留 mem
  • C++:“我的文本”是 std::string、*char 还是 c 字符串?

    我刚刚做了看似的事情新手常见的错误 https stackoverflow com questions 721129 spot the error in this file reading code c 首先我们读到许多教程之一 http
  • 字符类型边界处增量运算符的行为

    我想知道 C 在这种情况下的表现如何 char variable 127 variable 在这种情况下 变量现在等于 128 但是 增量运算符是否将值包装到其下限或是否发生了溢出 发生溢出并导致未定义的行为 第 5 5 节 如果在计算表达
  • 为什么这段带有“1234”的代码可以在 C++ 中编译?

    为什么会这样编译 char ch 1234 no error 但不能超过 4 个chars char ch 12345 error Too many chars in constant 是的 我知道 用于一个char and 用于字符串 我
  • 在 Scala 中有效地重复字符/字符串 n 次

    我想更有效地执行以下操作 def repeatChar char Char n Int List fill n char mkString def repeatString char String n Int List fill n cha
  • 在C#中,如何检测一个字符是否是非ASCII字符?

    我想在 C 中检查 char 是否包含非 ASCII 字符 检查特殊字符的最佳方法是什么 例如志 or ASCII 范围为 0 127 因此只需检查该范围 char c a or whatever char you have bool is
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC

随机推荐

  • imagenet 数据集读取数据速度记录

    电脑配置是固态硬盘 xff0c i7cpu xff0c 不进行计算 xff0c 只读数据 xff0c 不做数据增广 xff0c 只做resize 只看不赞不文明 xff0c 这是大约花费两天时间测试结果 目录 xff1a 1 xff0c 最
  • c++调python踩坑日志

    目录 import array 报错 矩阵互相转换 include numpy相关vs2019配置 数组太长报错 import array 报错 参考 xff1a https blog csdn net weixin 40232401 ar
  • pytorch 半精度训练

    必坑记录 这种训练直接变成nan了结果 实验结果 前者采用正常训练 后者改进为 from torch cuda amp import autocast as autocast 实验发现从一epoch44秒 xff0c 减少为35秒 但是训练
  • earth mover‘s distances学习记录

    https zhuanlan zhihu com p 145739750 后面的感觉没讲清楚 一开始我没想清楚 xff0c 为什么可以把问题转换成线性规划问题 问题转换一下 xff0c 一个工厂有A xff0c B xff0c C三个仓库
  • A Tutorial on Energy-Based Learning(机器学习能量模型)学习记录

    1 Introduction 其中Y是标签 X是输入 基于能量的机器学习模型即是寻找这样一个函数 和输入数据越接近 能量越小 给定一个输入 最好的模型即是对应的Y的值是真实值 这个真实值的能量是最小的 此模型可以做的工作有 预测 Ranki
  • dncnn(残差网络图像去燥记录)

    一 xff0c 生成训练数据 1 xff0c 原文相关知识 we use the noisy images from a wide range of noise levels e g 0 55 to train a single DnCNN
  • win10 10016自动重启错误解决记录

    1 xff0c 没解决 1352127440 xff0c 找到 组件服务 xff0c 然后依次展开组件服务 计算机 我的电脑 DCOM配置 xff0c 找到 9CA88EE3 ACB7 47C8 AFC4 AB702511C276 xff0
  • 无偏估计、有效性、相合性

    定义 xff1a 在已知概率分布函数构造的情况下 xff0c 概率分布的一些参数未知 xff0c 如高斯分布的namda 方差 xff0c 而利用采集到的参数来对未知参数进行估计就是参数估计 比较基础的有矩估计 最大似然估计 而不同的方法对
  • Windows10下安装point-cloud-annotation-tool点云标注工具——吐血之路总结

    零 为了标注点云数据 xff0c 经过多方查找免费开源的标注软件 xff0c 根据使用要求和方便程度最终选择了这款可以在Windows下编译安装的point cloud annotation tool xff0c 基于QT和vtk和PCL进
  • ROS 中CompressedImage消息的发布与订阅

    背景 xff1a 某些情况下需要录图像数据的包 xff0c 非常占空间和带宽 xff0c 尤其对于一些工业相机图像一张好几兆 xff0c 每秒30帧的话一份钟好几个G xff0c 这时候可以选择的订阅压缩图像 xff0c 下面直接来个dem
  • 【C#】简单的串口发送

    一 核心代码 xff1a SerialPort serialPort span class token operator 61 span span class token keyword new span span class token
  • 原生OKHttp以及OKHttpUtil的使用

    Android系统提供了两种HTTP通信类 xff0c HttpURLConnection和HttpClient 尽管Google在大部分安卓版本中推荐使用HttpURLConnection xff0c 但是这个类相比HttpClient实
  • c++编译器配置错误问题clang: error: linker command failed with exit code 1 (use -v to see invocation)

    背景 xff1a ubuntu18 04系统 之前装其他程序的时候安装了一些软件 xff0c 不知道什么时候g 43 43 编译器从 usr bin c 43 43 组里面给删掉了 xff0c 默认的编译器成了clang 43 43 xff
  • apollo7.0------浅谈激光雷达运动补偿(二)--计算解析

    背景介绍 运动补偿相关介绍参考第一篇博客 xff1a apollo7 0 浅谈激光雷达运动补偿 龙性的腾飞的博客 CSDN博客 lidar运动补偿 本篇博客主要解释一下上篇博客中运动补偿的计算部分 xff0c 简单来说就是一个利用四元数球面
  • Matlab激光雷达相机联合标定经验分享

    一 背景介绍 联合标定是做多传感器融合的基础工作 xff0c 也是一个没有最好只有更好的研究方向 xff0c 相关论文也是层出不穷 xff0c 网上也有许多开源的工作 xff0c 包括Autoware的工具箱我也试过 xff0c 感觉标定效
  • 如何更改Ubuntu系统的输出为HDMI(耳机,扬声器)?

    由于需要用HDMI外接音频设备 xff0c 故想要改变电脑输出 xff0c 本人用的为Ubuntu14 04 开始在网上搜寻怎么更改 xff0c 查到需在声音设置里面更改音频输出为HDMI xff0c 可当我打开声音设置 xff0c 嗯 x
  • PPT中插入图片背景透明化小技巧

    新版的编辑器真不适应 xff0c 费劲 xff01 xff01 xff01 最近两天做开题答辩ppt xff0c 发现了ppt中处理图片背景的一个小技巧 xff0c 在此分享给大家 PPT一般会带有背景图片 xff0c 那种带浅色调logo
  • ROS发布Float32MultiArray消息C++/Python

    在ros下发布一个字符串消息或整数消息 xff0c 网上例程不少 xff0c ROSwiki上也有教程 xff0c 有时就需要一次发送不止一个数据 xff0c 这时候就得用到数组了 xff0c C 43 43 的也好找 xff0c 不过py
  • c++中string、char *、char[]相互转换

    一 string转char 主要有三种方法可以将str转换为char 类型 xff0c 分别是 xff1a data c str copy 其中 xff0c copy 可能会报安全性错误 xff0c 自行解决即可 3 1 data 方法 s
  • char数组与char指针

    转载来源 xff1a https www cnblogs com nzbbody p 3553222 html https blog csdn net jack 20 article details 78913202 一 0 的添加 存在的