C++指针解读(6)-- 指针和字符串

C++学习篇——字符指针 #include<iostream> int main() { int number = 0; const char* s = "hello world!"; std::cout << "字符串首字母是" << "\"" << *s << "\"" << std::endl; std::cout << "字... 阅读详情

1、字符串的基本概念

(1)字符串的存储

字符串是存放在字符数组中的。比如字符串“hello”,在内存中是这么存放的:

这里要注意,在字符串的最后会加上一个'\0',也被称为NUL字符,表示字符串的结束位。比如定义char str[] = "hello",则sizeof(str)的长度是6,不是5。

(2)字符串的访问

既然字符串是字符按数组的方式存储的,我们可以用访问一维数组的方式来访问字符串。

char str[] = "hello";
printf(" %c\n", str[1]);

char* ch = &str[1];
printf(" %c\n", *ch);

(3)字符串常量池

用char数组str[]的方式定义字符串,我们也可以用下面的方式定义一个字符串:

char *str = "hello";

这里的str其实是一个char*型的指针变量,它指向字符串"hello"的首地址。

这种方式定义字符串时,"hello"是字符串常量,这个常量就放在字符串常量池中。

我们可以用代码来验证下:

const char* pstr1 = "hello";
const char* pstr2 = "hello";
printf(" p1 = %p, p2 = %p\n", pstr1, pstr2);

运行后发现pstr1, pstr2这2个地址是相同的,且每次运行地址都一样。这说明这个字符串常量是编译时就确定好的。

(4)sizeof()和strlen()

sizeof是C语言中的一个单目运算符,用来计算数据类型所占空间的大小,单位为字节;而strlen是一个函数,用来计算字符串长度(不包括字符串结束位NUL)。

char str1[] = "hello";
char str2[10] = "hello";
printf(" sizeof(str1) = %d, strlen(str1) = %d\n", sizeof(str1), strlen(str1));
printf(" sizeof(str2) = %d, strlen(str2) = %d\n", sizeof(str2), strlen(str2));

2、定义字符串的几种方式

(1)char str[] = {'h', 'e', 'l', 'l', 'o', '\0'};

定义了一个字符数组,长度为6,数组里的元素分布如下:{'h', 'e', 'l', 'l', 'o', '\0'}。

假如末尾没有NUL字符:char str[] = {'h', 'e', 'l', 'l', 'o' };

printf()输出str的值会是什么呢?sizeof()和strlen()的值分别是什么呢?

char str1[] = { 'h', 'e', 'l', 'l', 'o' };
printf(" %s\n", str1);
printf(" sizeof(str1) = %d, strlen(str1) = %d\n", sizeof(str1), strlen(str1));

这时,输出的str1是hello+一些乱码;sizeof(str1)是5,而strlen(str1)的值是个变数,每次的输出不一定相同。

因为字符串是以NUL作为字符串结束位的,现在缺少这个结束位,程序就没有办法做出正确的处理了。

(2)char str[] = "hello";

定义了一个字符数组,长度为6,系统会在末尾自动加上字位结束符NUL。

(3)char *pstr = "hello";

定义了一个字符指针变量,指向常量池中的字符常量"hello"。

4、字符指针变量和字符数组的比较

char *str1定义的是一个字符指针变量;char str2[10]定义的是一个字符数组,数组名代表数组元素首地址。

这是两个不同的概念,主要有以下区别:

(1)字符指针变量存放的是地址,指向字符串的第一个元素;字符数组就是一个存放字符的数组,一个元素就是一个字符。

(2)字符指针变量的值是可以改变的,但字符数组名的值不能改变(它只代表数组的首地址)。

const char *str1 = "hello";
printf(" %c\n", *str1);

str1++; //可以更改
printf(" %c\n", *str1);
    
char str2[10] = "hello";
str2++; //报错

(3)字符指针指向的字符串的内容不能被更改,但字符数组中各元素的值可以被更改。

const char *str1 = "hello";
str1[2] = 'a'; //报错

char str2[10] = "hello";
str2[2] = 'a'; //可以

(4)我们可以用str2[1], *(str2 + 1)这样的方式访问数组元素;对于字符指针变量,同样也可以用str1[1], *(str1 + 1)这样的方式访问。

const char *str1 = "hello";
printf(" %c, %c \n", str1[1], *(str1 + 1));

char str2[10] = "hello";
printf(" %c, %c \n", str2[1], *(str2 + 1));

(5)初始化的含义

char *str1 = "hello";

等价于:

char *str1;
str1 = "hello"; //把字符串的首地址给str

但字符数组的初始化:

char str2[10] = "hello";

不等价于:

char str2[10];
str2 = "hello"; //报错

其实这里的str1是个char *类型的指针变量,即字符指针变量,把字符数组的首地址赋给这个指针变量是没问题的。

而str2是数组的名字,代表字符数组首元素的地址,我们可以给这个地址赋值,但不能让地址去指向另外一个地址。

char str1[10];
*str1 = 'h'; //可以给地址赋值
strcpy(str1, "hello"); //可以直接内存拷贝

5、字符指针作函数参数

前面我们知道可以用两种方式来定义字符串,一种是字符数组,另一种是字符串指针变量。当函数的形参是字符串时,我们可以传字符数组的首地址,也可以传字符串指针变量。

(1)传字符数组的首地址

void print_str(char str[]) {
    int i = 0;
    while (str[i] != '\0') {
        printf("%c", str[i]);
        i++;
    }
}

int main()
{
    const char *str1 = "hello";
    print_str((char*)str1);

    char str2[10] = "hello";
    print_str(str2);

    return 0;
}

(2)传字符串指针变量

void print_str(char* str) {
    int i = 0;
    while (str[i] != '\0') {
        printf("%c", str[i]);
        i++;
    }
}

指针的“分身术”:指针数组 vs. 数组指针,及字符串排序实战 本文解析了C/C++中数组指针和指针数组的核心区别:数组指针是指向数组的指针(如int(*p)[10]),而指针数组是存放指针的数组(如int* p[10])。重点通过字符串排序案例展示了指针数组的实用价值,通过交换指针而非字符串本身实现高效排序。代码示例演示了使用选择排序对字符串指针数组进行降序排列,仅需交换指针即可完成排序,避免了字符串数据的移动,显著提升了性能。 阅读详情

相关推荐

C++基础之字符串与指针

一、字符串 1、字符串默认用字符数组来存储。 2、strlen求字符串长度是不包括\0的 3、 char a[]={“Hello World!”};或 char a[]=”Hello World!” // ’\0’由计算机自动加上。char c3[3][5]={{ 'a','b','c','d','\0'},{'m','n','p','\0'},{'x','y','z'

mazi的博客 4895

C++ 类对象与类指针(静态和动态多态)

代码: class Animal { public: virtual void eat() { cout << "我是动物 我在吃东西" << endl; } }; void main() { //建立类对象 animal Animal animal; animal.eat(); //建立类指针 animal Animal* animal = new Animal;//建立类型为Animal的类对象(new Animal) animal, 指向Animal类的指针(

Chroniccandy的博客 2808

C++ 之字符串、字符数组与字符指针(*、**)

C++ 之字符串、字符数组与字符指针(*、**)

yohnyang的博客 1264

指向字符串的指针(超详解)

1)什么是字符串 用双引号括起来的零个或多个字符"abcd" 2)字符串的结束符号: \0,它是一个字符,而不是一个字符串 3)字符串的输出; printf("%s",数组名) puts() 输入: scanf gets 4)strlen:用来测量一个字符串中所包含的字符个数 5)如果一个指针p指向了一个字符串,那我们就说p就是一个指向字符串指针 定义格式:char *指针名 ,如char *p 赋值:char *p = “abcd” or char *p; p = “abcd”; 可以把一个字符串直接赋

weixin_46465448的博客 1万+

C++之指针探究(八):指针函数和函数指针

前文:C++之指针探究(七):void指针、空指针、野指针 一 . 指针函数   函数的类型,事实上指的就是函数的返回值。根据需求,一个函数可以返回字符串、整型和浮点型这些基本类型的数据。当然,它还可以返回指针类型的数据,这种返回指针类型数据的函数称为指针函数。定义指针函数的时候只需要与定义指针变量一样,在类型后边加一个星号即可。   注意:不要将局部变量的指针(地址)作为函数的返回值。   指针函数是一个返回指针变量的函数。 例1: 运行结果: 分析:   char∗\ast∗ getWord(cha

小勇博客 591

深入理解C++中的数组、指针与字符串

本文详细探讨了C++中数组、指针和字符串的使用和操作。首先,通过实例展示了深拷贝的实现和析构函数的作用。接着,介绍了C++中字符串常量的存储方式以及使用字符数组来存储和处理字符串的方法。最后,重点阐述了C++标准库中string类的使用,包括构造函数、成员函数和相关操作符,并通过人事信息管理程序的示例来展示这些概念在实际编程中的应用。

weixin_36122351的博客 226

C++学习笔记4 - 符合类型

《C++ Primer Plus  第6版》读书笔记 知识点: 1.C++数组初始化 可以省略“=”   int lift[10] {1, 2, 4};   等价 int lift[10] = {1, 2, 4};   int lift[10] {}; //等于  {0} 2.'S' 是83的另一种写法。“S” 表示 S和\0  并且“S” 表示的为地址 3.键盘输入读取一行处理  

静心修行 561

维护测试监控LLM应用

LangFuse: 开源 + SaaS(免费/付费),LangSmith 平替,可集成 LangChain 也可直接对接 OpenAI API;LangSmith: LangChain 的官方平台,SaaS 服务(免费/付费),非开源,企业版支持私有部署;调试 Prompt 的 Playground测试/验证系统的相关指标数据集管理各种指标监控与统计:访问量、响应时长、Token 费等等。

SunnyRivers 1780

C++指针解读

一、概念:指针与引用 程序中的所有变量与函数都存放到内存中,C++提供了指针对它们在内存中的地址进行访问。指针的功能强大,操作灵活,还能提高程序的运行效率。相对地,对内存操作是一把双刃剑,如果处理不当,将会造成程序的崩溃。引用则是变量的别名,它们使用同一块地址。 整型变量i和j在内存中存储 1.指针的声明 声明指针的一般形式如下: 数据类型标识符 *指针变量名 ...

gangganggood的专栏 1559

vuecli3 实现 移动端和pc端 界面切换(两套代码)

适合场景 多页面多系统应用 所有系统都在同一目录下。配置多入口多出口。每个系统之间可以链接。每个系统内依然采用Vue单页应用开发。 产品需求:一套代码 兼容pc端和移动端 , 移动端和pc端的样式布局差别很大,需要使用多界面,并判断使用手机的时候跳转移动端代码,使用pc端跳转pc端代码。 项目目录 分为两部分代码,pc 和mobile 第一步:创建一个登陆页面的文件 在项目public文件夹下创建一个login.html,其实就是将index.html复制一份,将title改一下: <!DOCTYP

你怎么也喜欢嘴巴嘟嘟 5919

多模态情感识别(MER)数据集实战指南:从IEMOCAP到应用落地

本文提供了多模态情感识别(MER)从数据集到应用落地的完整实战指南。以经典IEMOCAP数据集为例,详细讲解了音频、视觉、文本等多模态数据的预处理、特征提取与融合技术,并分享了模型训练调优心得及面向智能客服、在线教育等场景的部署考量,帮助开发者快速构建高效可用的MER系统。

h3i4j的博客 1071

【C/C++】一文带你彻底玩转C/C++中的指针!(万字解读,非常详细!适合初学者或老手回顾)

万字详细解读指针个各项用法和细节。从指针入门到深入理解。

greatming666的博客 1万+

【NVIDIA驱动的顽固问题】---- /dev/sdax:clean,xxx/xxx files,xxx/xxx blocks ---- 最全解决方法

本文的意义在于整理总结关于此问题的全部解决方法,希望能给大家节约时间。

lc1852109的博客 3127

C/C++字符数组、字符指针和字符串常量

1. 字符数组 2. 字符串长度 3. 字符指针

LianYeHeTianTian的博客 1340

01-FreeSWITCH 的安装、部署、配置以及可能遇到的问题和解决方法

一文让您了解从FreeSWITCH 的安装、部署、配置、可能遇到的问题及解决方法。一切从实际项目出发,以工程应用为目的。

秋风的博客 2127

Android Studio打包全攻略---从入门到精通

初出茅庐 手动打包怎么手动打包项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。 1. 创建签名文件 2. 填写好签名参数 3. 生成APK 注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件别泄漏了,也别搞丢了为什么要打包我最开始就有这个疑问,我们的代码不是点了下运行按钮就直接安装到手机上了吗,我们在在项目Project

我早就想,要这样载着你,翻山越岭 2万+

指针的使用——字符、字符串、字符串数组(char*)

摘要:本文探讨了字符和字符串指针在C++中的使用区别。字符指针(char*)可以指向单个字符变量,通过解引用修改内容;字符串指针指向字符数组时可读写,指向字符串常量(const char*)时则不可修改内容。字符串数组指针(char*[])可重新指向不同字符串,但同样无法修改常量字符串的内容。关键差异在于字符串常量存储在只读内存区(.rodata段),禁止写入。文中通过代码示例详细演示了指针声明、初始化、访问和修改的操作方法,并解释了cout对char*的特殊处理机制。

Dfreedom.的博客 1941

基于FPGA的DDR学习——1.基础知识

⚪DDR2(Double Data Rate2)SDRAM是由JEDEC(电子设备工程联合委员会)开发的第三代SDRAM内存技术标准,1.8V工作电压,240线接口,提供了相较于DDR SDRAM更高的运行效能与更低的电压,同样采用在时钟的上升/下降沿同时进行数据传输的基本方式,但拥有两倍于上一代DDR内存预读取能力(即4bit数据预取能力),其常见的频率规范有DDR2 400\533\667\800\1066\1333等,总线频率553MHZ的DDR2内存只需133MHZ的工作频率。

qq_44932488的博客 2070

C/C++ 中的指针[非常全面]

关于指针及相关知识,这一篇就够了

weixin_58045467的博客 2050

大数据领域数据产品的交通运输行业应用

您是否经历过早高峰被堵在桥上,看着导航显示“前方5公里缓行”却无能为力?是否见过货车司机绕远路导致成本飙升?这些“交通痛点”的背后,是传统交通管理依赖经验决策的局限。本文将聚焦“大数据数据产品”这一核心工具,从技术原理到实际应用,全面解析它如何为交通运输行业“开天眼”,解决从城市拥堵到物流效率的一系列难题。本文将按照“问题引入→概念拆解→技术原理→实战案例→应用场景→未来趋势”的逻辑展开,用生活化比喻降低理解门槛,用代码和数学模型提升专业性,最终帮您建立“大数据+交通”的完整认知框架。交通数据。

操作系统内核探秘的博客 237

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++ 数组、数组指针、指针数组、动态数组等详解

先了解一下数组的结构,然后接着了解动态数组的结构。 数组数组: (1)数组大小固定。 (2)数组是一种复合类型 (3)存放类型相同的对象的容器,需要通过所在位置访问这些对象。 (4)数组的元素应该为对象,因此不存在引用的数组 (5)维度:数组中元素的个数,必须大于0,编译的时候维度应该是已知的,也就是说,维度必须是一个常量表达式。 (6)不能将数组的内容拷贝给其他数组作为其初始值,也不

暖心~的博客 5277

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

容易混淆的不同字符串的定义形式 char p[ ]和char * q有什么区别。烧脑指针练习之c语言三级指针,指针的运算和使用。

字符串的定义形式 char a[ ] = "abcdef"; //这种定义下,a是一个字符数组,数组里有7个元素 abcdef \0。 只有在&a 和单独放置在sizeof中时,代表的是整个数组的地址 ,除此之外,都代表数组首元素的地址。 char* p = "abcdef";//在这种定义下,系统会创建一个常量字符串(常量字符串,只能被访问,不能修改其中的数据。),而p中放置的是字符a的地址。这里要注意:这种定义方式下 p并不是一个数组。它只是一个装着常量字符串中首字符a的地址的..

qq_51004011的博客 1701

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

从封装算法库中复习C++中的指针和数组(字符串相关)

近期,封装了一些底层算法库,该库由C++开发,过程中深感基础知识遗忘过多,趁周末进行总结: 总结中参考了《征服C指针》 字符串常量 1.使用""包围起来的字符串被称为字符串常量。 2.字符串常量的类型是 "char"的数组,因此在表达式中,它可以被解读为指针。 [个人理解:单一字符使用char类型,字符串即多个字符“串起来”,即char的数组,C这种强类型语言之所以强调类型,其本质就是因...

qq_34241037的博客 188

指针进阶详解(上)

指针是检验学者对C语言掌握好与坏的重要标准之一,在指针初阶指针是一个变量,用来存放地址,地址唯一标识一块空间。指针的大小固定为4/8个字节(32位平台/64位平台)指针是有类型,指针的类型决定了指针±整数的步长,指针解引用时候的权限。指针的运算。接下来,我们将继续探讨指针的高级主题。

Zhenyu_Coder的博客 970

C++ 语法之数组指针

比如定义了一个int b[2][3],可以看成是什么,可以看成是我们定义了2个一维数组a[3]。可以看到a[3]的地址,是在a[2]的基础上加了个四个字节,这就是数组的规则。可以看到内存的首地址是FAA8开始,注意这里的a和a[0]的地址是相等,因为它们都是代表数组的第一个地址。a+1的话,它就会在a的值加1, 指针变量+1的意思,是在原来的地址上,增加该类型的字节数。那么b[0]即b[0][0]的的首地址,这个跟前面一维数组同样的原理,a跟a[0]地址一样。它的跨度是一个a[3]的跨度 12字节。

d3582077的专栏 1204

复杂指针的声明和关于指针的几个小例子

参考自:《C和C++程序员面试秘籍》 a: 一个有10个指针的数组,该指针是指向一个整型数的 int *a[10] b:一个指向有10个整型数数组的指针 int (*a)[10] c:一个指向函数的指针,该函数有一个整形参数并返回一个整型数 int (*fun)(int) d:一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数 int (*fun[10])(int) 如何解读复杂指针? int (*func)(int *p); 解析上面这行代码: 首先找到未定义的标识

u012127512的博客 333
上一篇: C++指针解读(5)-- 指针和数组(多维数组)
下一篇: C++指针解读(7)-- 指针和函数
老蔡编程
博客等级 码龄23年 48粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值