字符串地指针表示方式

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

相关文章

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息,然后展示在页面上。 效果展示 首次发送需要设置昵称 发送消息与消息展示 提示用户不能发送空消息 后端接口 发送消息 DB = []@ro

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

脏页的标记方式详解

脏页的标记方式 一、引言 在数据库系统中,脏页是指那些被修改过但还未写入磁盘的数据页。为了有效地管理这些脏页并确保数据的一致性,数据库需要对脏页进行标记。了解脏页的标记方式对于理解数据库的内部工作机制和优化性能至关重要。 二、脏页产生的过程 当数据库中的数据被修改时,这些修改首先会在内存中的缓冲池(Buffer Pool)中进行。例如,执行一条 UPDATE 语句修改了某一行数据,对应的缓

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

前端form表单+ifarme方式实现大文件下载

// main.jsimport Vue from 'vue';import App from './App.vue';import { downloadTokenFile } from '@/path/to/your/function'; // 替换为您的函数路径// 将 downloadTokenFile 添加到 Vue 原型上Vue.prototype.$downloadTokenF