字符串地指针表示方式

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

相关文章

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Jenkins分布式集群配置方式

《Jenkins分布式集群配置方式》:本文主要介绍Jenkins分布式集群配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装jenkins2.配置集群总结Jenkins是一个开源项目,它提供了一个容易使用的持续集成系统,并且提供了大量的plugin满

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys