鱼C论坛

 找回密码
 立即注册
查看: 1059|回复: 12

[已解决]指针初学疑惑

[复制链接]
发表于 2020-9-7 14:10:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
纯初学小白提个问题:

char str[] = "home";
char *p = str;

str占了5个字节,是不是就有5个内存地址,指针变量p是8个字节,我搞不懂这5个地址是怎么存到变量p的8个字节里的?
最佳答案
2020-9-7 15:07:31
本帖最后由 sunrise085 于 2020-9-7 15:22 编辑

二楼说的不对
指针是一个数据类型,char也是一个数据类型,二者是不同的数据类型。
指针自己的长度就是8个字节(在64位系统中),它存放的是一个地址,在你的这段程序中存放的是str数组的首地址,在64位系统中一个地址长度是64位,即8个字节。
str[]是一个char类型的数组,数组长度为5,存放五个char类型的数据,数组内容分别是'h'  'o'  'm' 'e'  '\0',每个字符占一个字节,char类型的变量就是一个字节,因此数组占5个字节

举个例子,假设str首地址是0x3a5de8903a5de890,那么,'h'的地址就是0x3a5de8903a5de890,然后其他字符的地址依次向后,分别是0x3a5de8903a5de891,0x3a5de8903a5de892,0x3a5de8903a5de893,0x3a5de8903a5de894 。指针p指向str,则指针p存放的内容是0x3a5de8903a5de890,这是一个64位的数据,所以占8个字节。


看图,地址都是随便编的
搜狗截图20200907151729.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-7 14:43:41 | 显示全部楼层
对于字符型变量来说,一个内存地址就是一个贮存单元,str 占 5 个单元,共 40 个字节

指针变量 p 是 8 个字节,但它是一个贮存单元
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-7 14:49:25 | 显示全部楼层
风过无痕1989 发表于 2020-9-7 14:43
对于字符型变量来说,一个内存地址就是一个贮存单元,str 占 5 个单元,共 40 个字节

指针变量 p 是 8  ...

那是不是p变量这个8字节单元里存的就是对应数据的第一个地址,然后通过p的加减运算获取到其他数据对应地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-7 14:56:58 | 显示全部楼层
char* 这个指针变量的长度是4个字节,至于你说的8字节,如何理解?
关于str是占了5块内存,
其实我们查看汇编代码,或者说你把一个程序拖到WinHex类似的工具中,你发现,所有的程序都是各种“内存数据”组合而成,而有些内容能代表字符串,而有些代表执行代码。
对于指针而言,我只要保存字符串首地址就行了,因为系统会自动识别(字符串以'\0'结尾),这个字符串到底多长。就好比,我只要有开你家门的钥匙,我不用管我能去你家拿什么,只要去了你家,你还怕我拿不到你家里有的东西吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-9-7 15:07:31 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-9-7 15:22 编辑

二楼说的不对
指针是一个数据类型,char也是一个数据类型,二者是不同的数据类型。
指针自己的长度就是8个字节(在64位系统中),它存放的是一个地址,在你的这段程序中存放的是str数组的首地址,在64位系统中一个地址长度是64位,即8个字节。
str[]是一个char类型的数组,数组长度为5,存放五个char类型的数据,数组内容分别是'h'  'o'  'm' 'e'  '\0',每个字符占一个字节,char类型的变量就是一个字节,因此数组占5个字节

举个例子,假设str首地址是0x3a5de8903a5de890,那么,'h'的地址就是0x3a5de8903a5de890,然后其他字符的地址依次向后,分别是0x3a5de8903a5de891,0x3a5de8903a5de892,0x3a5de8903a5de893,0x3a5de8903a5de894 。指针p指向str,则指针p存放的内容是0x3a5de8903a5de890,这是一个64位的数据,所以占8个字节。


看图,地址都是随便编的
搜狗截图20200907151729.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-7 15:40:40 | 显示全部楼层
sunrise085 发表于 2020-9-7 15:07
二楼说的不对
指针是一个数据类型,char也是一个数据类型,二者是不同的数据类型。
指针自己的长度就是8 ...

好清晰,那如果str是int类型,占4个字节,那也是有4个地址,指针里存的也是首地址么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-7 15:50:12 | 显示全部楼层
本帖最后由 sunrise085 于 2020-9-7 15:52 编辑
dysow 发表于 2020-9-7 15:40
好清晰,那如果str是int类型,占4个字节,那也是有4个地址,指针里存的也是首地址么?


若改为int类型的数组,那么指针是不会变的,但是数组的各个元素地址会变化。
看图
搜狗截图20200907155157.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-7 16:03:29 | 显示全部楼层
sunrise085 发表于 2020-9-7 15:50
若改为int类型的数组,那么指针是不会变的,但是数组的各个元素地址会变化。
看图

不好意思,刚才我没表达清楚,我是想说这个意思

int str = 10;
int *p = str;

str占4个字节,那它是有4个地址还是1个地址,存到p里是怎么存的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-7 16:16:59 | 显示全部楼层
dysow 发表于 2020-9-7 16:03
不好意思,刚才我没表达清楚,我是想说这个意思

int str = 10;

当然是一个地址啦
int str=10;
int*p=str;
就相当于上面这个图中,把str数组的后四个元素抹去,只剩一个元素,那就是一个int变量了,int类型变量占四个字节,但是地址只有一个
指针p也是只有一个地址!给你写的上面这个图中的p写了8个地址,不是说p有8个地址,是说p占8个字,是为了给你说p的这8个字节的内容,p的地址是0x58eda8c938adef80
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-7 16:24:14 | 显示全部楼层
sunrise085 发表于 2020-9-7 16:16
当然是一个地址啦

就相当于上面这个图中,把str数组的后四个元素抹去,只剩一个元素,那就是一个int变 ...

内存中不是每个字节都对应一个地址么,那该怎么理解一个int类型4个字节,但只有一个地址呢,我确实绕在这里了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-7 16:35:26 | 显示全部楼层
dysow 发表于 2020-9-7 16:24
内存中不是每个字节都对应一个地址么,那该怎么理解一个int类型4个字节,但只有一个地址呢,我确实绕在这 ...

就好像给房间编号一样
一栋楼里有无数个大小一样的房间,正常情况下每个房间一个房间号:000,001,002,003,004,……
一些有钱人直接买两套,然后打通了,把多余的门口堵上了,这样房子就变成了000,002,004,……
若有一些人更加有钱,都是直接买四套,然后打通,把多余的门口堵上了,这样的话,房间号就变成了 000,004,008,……
若有一些特别有钱的人,买的更多,直接买八套,然后打通,把多余的门口堵上了,房间号就变成了 000,008,016,……

不知这样说你是否理解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-7 16:37:32 | 显示全部楼层
sunrise085 发表于 2020-9-7 16:35
就好像给房间编号一样
一栋楼里有无数个大小一样的房间,正常情况下每个房间一个房间号:000,001,002 ...

我去,太通俗易懂了!彻底明白了!多谢大神指点!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-8 00:25:04 | 显示全部楼层
4goodworld 发表于 2020-9-7 14:56
char* 这个指针变量的长度是4个字节,至于你说的8字节,如何理解?
关于str是占了5块内存,
其实我们查看 ...

5楼已经回答你了。
我的错误是将 bit 与 byte 搞混了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 06:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表