字符串地指针表示方式

每日诗词:

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

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


目录

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

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++字符串的基本操作
  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值