字符串地指针表示方式

2024-09-03 02:52
文章标签 指针 字符串 方式 表示

本文主要是介绍字符串地指针表示方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

每日诗词:

人生自是有情痴,此恨不关风与月。

                                                      ——玉楼春·尊前拟把归期说 【宋】欧阳修


目录

数组本身的值和数组储存的值一样吗

char[]和cahr*的区别

1. 类型

2. 内存分配

3. 使用方式

4. 字符串字面量

实例

变式

总结:

下期预告:C++字符串的基本操作


今天我们来说明一个问题字符串的指针表示方式。这个算是指针的前瞻,通过这一章地介绍来简单了解一下指针的用法为以后学习指针打个基础。首先我们要知道指针变量存储的就是变量的地址,通过这个地址来控制这个变量,达到一些想要的目的(目的十分的广泛)。

注意看下面的说明,有助于理解:

数组本身的值和数组储存的值一样吗

数组本身的值和数组储存的值在概念上并不完全相同,但这里的表述可能有些模糊,因为它取决于我们如何理解“数组本身的值”。让我们澄清一下这两个概念:

  1. 数组本身的值在大多数编程语境中,当我们谈论“数组本身的值”时,我们可能是在指代数组这个数据结构本身,或者更具体地说,是数组对象或数组的引用(在支持引用的语言中)。这个“值”实际上是一个引用或内存地址,它指向了数组在内存中存储数据的实际位置。在像C/C++这样的语言中,数组名在大多数情况下被视为指向数组首元素的指针(尽管它们在语法上与普通指针有所不同)。在像Java或C#这样的语言中,数组是一个对象,拥有自己的属性和方法,而变量存储的是对这个对象的引用。

  2. 数组储存的值:这是指数组内部实际存储的数据。对于字符数组(字符串)、整数数组、浮点数数组等,这些都是数组内部存储的具体值。例如,如果你有一个整数数组int arr[] = {1, 2, 3, 4, 5};,那么数组储存的值就是这些整数:1, 2, 3, 4, 5。

因此,当我们问“数组本身的值和数组储存的值一样吗?”时,答案是不一样。数组本身的值(或更准确地说是数组对象的引用或数组在内存中的位置)与数组内部实际存储的数据值是两个不同的概念。一个指向数组在内存中的位置,而另一个则是该位置存储的具体数据。

不过,在一些非严格或口语化的表述中,人们可能会将“数组的值”直接理解为数组内部存储的数据值,而不特别区分“数组本身”和“数组储存的值”。因此,在实际交流中,需要根据上下文来理解这些表述的具体含义。

char[]和cahr*的区别

在C和C++中,char[] 和 char* 虽然在很多情况下都可以用来处理字符串,但它们之间存在一些本质的区别,主要体现在它们的类型、内存分配、以及使用方式上。

1. 类型
  • char[] 是一个字符数组,它是一个固定大小的字符序列。数组的大小在声明时就确定了,并且在整个生命周期内保持不变。
  • char* 是一个指向字符的指针,它可以指向任何字符(包括字符串的第一个字符)或空(nullptrNULL)。指针本身不存储数据,而是存储数据的内存地址。
2. 内存分配
  • char[] 通常在栈上分配内存(对于局部变量)或在全局/静态存储区分配(对于全局或静态变量)。其大小在编译时就确定了。
  • char* 可以指向任何位置,包括栈上、全局/静态存储区以及堆上的内存。当char*用于字符串时,它通常指向一个以空字符('\0')结尾的字符数组。这个数组可以在栈上、全局/静态存储区或堆上分配。如果char*是在堆上分配字符串的,那么需要使用new(在C++中)或malloc(在C中)等函数,并在不再需要时释放内存(使用delete[]free)。
3. 使用方式
  • char[] 由于其大小固定,因此使用起来相对简单直接。可以直接通过索引访问数组中的元素,但不能改变数组的大小(尽管可以修改数组中的元素)。
  • char* 由于其灵活性,可以指向不同的字符串,但使用时需要更加小心。需要确保指针所指向的内存是有效的,并且在不再需要时正确管理内存(避免内存泄漏)。此外,通过指针访问字符串时,需要注意字符串的结束符('\0'),以确保不会越界访问。
4. 字符串字面量

在C和C++中,字符串字面量(如"hello")通常存储在只读内存区域中,并且编译器会自动在末尾添加一个空字符('\0')。尝试修改字符串字面量的内容是未定义行为,但可以将字符串字面量的地址赋给char*类型的指针。然而,这并不意味着你可以修改该字符串;它仅仅意味着你有一个指向该字符串的指针。

实例

#include<iostream>
using namespace std;
int main()
{
char str[11]={"helloworld"};
char*pstr="helloworld";for(int i=0;i<10;++i)
{
str[i]+=1;
cout<<str[1]<<endl;
}for(int 1=0;i<10;++i)
{
pstr[i]+=1;
cout<<pstr[i]<<endl;
}return 0;
}

解释:我们先定义了一个数组和指针,然后利用一个循环将helloworld的每一个字母进行加一,在C++中ASCII码表中字母就会向后推一位(比如:h->i) ,然后输出。

结果:

这段代码只有第一个循环时可以输出结果的,第二个循环无法输出结果。

因为指针指向的变量是无法改变的,指针指向的helloworld是无法改变的。但是数组的存储的值是可以改变的。


char str[11]={"helloworld"};
char*pstr="helloworld";
pstr=str;

上面的代码就可以实现了,输出就会有两个循环的结果。(但是实际上由于指针指向数组的区域,那么改变的其实就是数组的那部分区域)如果大家会设断点,那么就可以看到在编译器中改变的从始至终都是数组存储的值。

char str[11]={"helloworld"};
char*pstr=str;

两种都是对的。 

变式
char str[11]={"helloworld"};
char*pstr="helloworld";str=pstr;

这个时候就出现了问题。那是因为数组变量的值是无法改变的(数组的地址)。

总结:

数组本身的值是无法改变的,但是数组存储的值是可以改变的;

指针本身的值是可以改变的,但是指针定义指向的值是不一定可变的。


🆗到这里,这篇关于:C++字符串的指针表示就说完了,求一个免费的赞,感谢阅读。

下期预告:C++字符串的基本操作

这篇关于字符串地指针表示方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131818

相关文章

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh