字符串地指针表示方式

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

相关文章

C#和Unity中的中介者模式使用方式

《C#和Unity中的中介者模式使用方式》中介者模式通过中介者封装对象交互,降低耦合度,集中控制逻辑,适用于复杂系统组件交互场景,C#中可用事件、委托或MediatR实现,提升可维护性与灵活性... 目录C#中的中介者模式详解一、中介者模式的基本概念1. 定义2. 组成要素3. 模式结构二、中介者模式的特点

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

Java异常捕获及处理方式详解

《Java异常捕获及处理方式详解》异常处理是Java编程中非常重要的一部分,它允许我们在程序运行时捕获并处理错误或不预期的行为,而不是让程序直接崩溃,本文将介绍Java中如何捕获异常,以及常用的异常处... 目录前言什么是异常?Java异常的基本语法解释:1. 捕获异常并处理示例1:捕获并处理单个异常解释:

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Redis分布式锁中Redission底层实现方式

《Redis分布式锁中Redission底层实现方式》Redission基于Redis原子操作和Lua脚本实现分布式锁,通过SETNX命令、看门狗续期、可重入机制及异常处理,确保锁的可靠性和一致性,是... 目录Redis分布式锁中Redission底层实现一、Redission分布式锁的基本使用二、Red

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

Python中经纬度距离计算的实现方式

《Python中经纬度距离计算的实现方式》文章介绍Python中计算经纬度距离的方法及中国加密坐标系转换工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj... 目录一、基本方法1. 使用geopy库(推荐)2. 手动实现 Haversine 公式3. 使用py

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

MyBatis流式查询两种实现方式

《MyBatis流式查询两种实现方式》本文详解MyBatis流式查询,通过ResultHandler和Cursor实现边读边处理,避免内存溢出,ResultHandler逐条回调,Cursor支持迭代... 目录MyBATis 流式查询详解:ResultHandler 与 Cursor1. 什么是流式查询?