指针初学疑惑
纯初学小白提个问题:char str[] = "home";
char *p = str;
str占了5个字节,是不是就有5个内存地址,指针变量p是8个字节,我搞不懂这5个地址是怎么存到变量p的8个字节里的? 对于字符型变量来说,一个内存地址就是一个贮存单元,str 占 5 个单元,共 40 个字节
指针变量 p 是 8 个字节,但它是一个贮存单元 风过无痕1989 发表于 2020-9-7 14:43
对于字符型变量来说,一个内存地址就是一个贮存单元,str 占 5 个单元,共 40 个字节
指针变量 p 是 8...
那是不是p变量这个8字节单元里存的就是对应数据的第一个地址,然后通过p的加减运算获取到其他数据对应地址 char* 这个指针变量的长度是4个字节,至于你说的8字节,如何理解?
关于str是占了5块内存,
其实我们查看汇编代码,或者说你把一个程序拖到WinHex类似的工具中,你发现,所有的程序都是各种“内存数据”组合而成,而有些内容能代表字符串,而有些代表执行代码。
对于指针而言,我只要保存字符串首地址就行了,因为系统会自动识别(字符串以'\0'结尾),这个字符串到底多长。就好比,我只要有开你家门的钥匙,我不用管我能去你家拿什么,只要去了你家,你还怕我拿不到你家里有的东西吗? 本帖最后由 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个字节。
看图,地址都是随便编的
sunrise085 发表于 2020-9-7 15:07
二楼说的不对
指针是一个数据类型,char也是一个数据类型,二者是不同的数据类型。
指针自己的长度就是8 ...
好清晰,那如果str是int类型,占4个字节,那也是有4个地址,指针里存的也是首地址么? 本帖最后由 sunrise085 于 2020-9-7 15:52 编辑
dysow 发表于 2020-9-7 15:40
好清晰,那如果str是int类型,占4个字节,那也是有4个地址,指针里存的也是首地址么?
若改为int类型的数组,那么指针是不会变的,但是数组的各个元素地址会变化。
看图
sunrise085 发表于 2020-9-7 15:50
若改为int类型的数组,那么指针是不会变的,但是数组的各个元素地址会变化。
看图
不好意思,刚才我没表达清楚,我是想说这个意思
int str = 10;
int *p = str;
str占4个字节,那它是有4个地址还是1个地址,存到p里是怎么存的? 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
sunrise085 发表于 2020-9-7 16:16
当然是一个地址啦
就相当于上面这个图中,把str数组的后四个元素抹去,只剩一个元素,那就是一个int变 ...
内存中不是每个字节都对应一个地址么,那该怎么理解一个int类型4个字节,但只有一个地址呢,我确实绕在这里了{:5_104:} dysow 发表于 2020-9-7 16:24
内存中不是每个字节都对应一个地址么,那该怎么理解一个int类型4个字节,但只有一个地址呢,我确实绕在这 ...
就好像给房间编号一样
一栋楼里有无数个大小一样的房间,正常情况下每个房间一个房间号:000,001,002,003,004,……
一些有钱人直接买两套,然后打通了,把多余的门口堵上了,这样房子就变成了000,002,004,……
若有一些人更加有钱,都是直接买四套,然后打通,把多余的门口堵上了,这样的话,房间号就变成了 000,004,008,……
若有一些特别有钱的人,买的更多,直接买八套,然后打通,把多余的门口堵上了,房间号就变成了 000,008,016,……
不知这样说你是否理解。 sunrise085 发表于 2020-9-7 16:35
就好像给房间编号一样
一栋楼里有无数个大小一样的房间,正常情况下每个房间一个房间号:000,001,002 ...
我去,太通俗易懂了!彻底明白了!多谢大神指点! 4goodworld 发表于 2020-9-7 14:56
char* 这个指针变量的长度是4个字节,至于你说的8字节,如何理解?
关于str是占了5块内存,
其实我们查看 ...
5楼已经回答你了。
我的错误是将 bit 与 byte 搞混了
页:
[1]