鱼C论坛

 找回密码
 立即注册
查看: 1488|回复: 14

关于指针

[复制链接]
发表于 2016-8-21 02:26:29 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 好人 于 2016-8-21 02:28 编辑
#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    char c=1;
    int d=&c;
    int *q=(&c);
    printf("%d,%d",d,*q);
}
*q输出为什么是2049 ?
我这样理解。(&是取地址 ,*是取内容)
首先 c=1(恩 没有引号  我看了 调试 确实内容还是'x01',打印出来是1 ,为什么 打印出来不是x01- -);
接着        d得到c的地址(c的地址变成d的内容);。。。。
再者 c的地址 又         给了 q的内容(我认为 是 这样的 ,因为*q嘛0 0。。。 *q不就是内容,可以 我调试下 看了 内容是2049.。。)
这是为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-21 09:37:48 | 显示全部楼层
c是1字节的  int是4字节 你把c的地址给q  那么*q的时候就取的是c的地址处的4个字节
比如c的地址是(0010)
0010   1
那么你把c的地址给q  q指向0010
但是*q的时候取的0010 0011 0012 0013四个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-21 14:38:28 | 显示全部楼层
迷雾少年 发表于 2016-8-21 09:37
c是1字节的  int是4字节 你把c的地址给q  那么*q的时候就取的是c的地址处的4个字节
比如c的地址是(0010)
...

但是 那个 0011 0012  0013 我没有给他值 。他为什么还输出是2049
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-21 15:10:07 | 显示全部楼层
2049对应二进制是(这里写成4个字节=32位)

00000000 00000000 00001000 00000001
因为你char c = 1  所以猜测你电脑是小端模式。。
那么内存的情况是这样的
0010 : 00000001 (一个单位1字节=8位)
0011 : 00001000 (一个单位1字节=8位)
0012 : 00000000 (一个单位1字节=8位)
0013 : 00000000 (一个单位1字节=8位)
你的char c就存在0010
然后你的p指针指向0010  读取的时候读4个字节 ,如果按照小端模式读取
就是  00000000 00000000 00001000 00000001
转换成十进制就是2049

至于0010处为什么会有 00001000 那就不清楚了
上面都是我的推测可能有错,你最好看下c的地址 然后用ce内存浏览器浏览下这个地址  就一目了然了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-21 16:10:57 | 显示全部楼层
迷雾少年 发表于 2016-8-21 15:10
2049对应二进制是(这里写成4个字节=32位)

00000000 00000000 00001000 00000001

我原代码有误
代码是这个
#include <stdio.h>

int main(int argc, const char * argv[]) {
    int b=8;
    char c=1;
    int d=&c;
    int *q=(&c);
    printf("%d,%d",d,*q);
}
在b=8 的情况下才是 2049
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-21 16:14:10 | 显示全部楼层
d=1600416283(也是很奇怪 为什么不是只有8位)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-21 16:15:19 | 显示全部楼层
好人 发表于 2016-8-21 16:10
我原代码有误
代码是这个
在b=8 的情况下才是 2049


这个有点复杂 不同机器不同编译器结果不一样  总之就是你的q指针读的内容不止是那个c的数据 连还一直读下去读到b的数据一部分 所以你改b=7就是2049
我这里输出的完全和你不一样 新手的话就别折腾这了。。你开个CE内存浏览器 输出各个变量的值就一目了然了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-21 16:26:55 | 显示全部楼层
本帖最后由 好人 于 2016-8-21 16:29 编辑

f
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-8-21 16:28:04 | 显示全部楼层
迷雾少年 发表于 2016-8-21 16:15
这个有点复杂 不同机器不同编译器结果不一样  总之就是你的q指针读的内容不止是那个c的数据 连还一直读 ...

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-21 16:31:52 | 显示全部楼层
迷雾少年 发表于 2016-8-21 16:15
这个有点复杂 不同机器不同编译器结果不一样  总之就是你的q指针读的内容不止是那个c的数据 连还一直读 ...
(lldb) x/4dg q
0x7fff5fbff79b: -4613990594799204351
0x7fff5fbff7a3: -4607123045163729057
0x7fff5fbff7ab: -4614008186985250465
0x7fff5fbff7b3: -3367094930869584033
(lldb) 
q=0x7fff5fbff79b
*q=2049
d=1606416283
x='\x01'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-21 16:35:24 | 显示全部楼层
http://www.cnblogs.com/kenshincui/p/3848442.html
这是别人的解释 我看不懂。 在第一个例子中 的下面 他也是输出2049
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-21 16:37:07 | 显示全部楼层
好人 发表于 2016-8-21 16:14
d=1600416283(也是很奇怪 为什么不是只有8位)

你这是64位程序了吧。。。地址64位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-21 16:44:59 | 显示全部楼层
好人 发表于 2016-8-21 16:35
这是别人的解释 我看不懂。 在第一个例子中 的下面 他也是输出2049

他那是16位编译器
int2 字节
int*指针读2 字节
读取的时候把c(1字节) 和b (有2字节,但是因为读了c 所以只读b的1字节)都读了出来 所以变成 了那么个数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-21 19:15:10 | 显示全部楼层
迷雾少年 发表于 2016-8-21 16:44
他那是16位编译器
int2 字节
int*指针读2 字节

谢谢 我测试了一下 明白了  
address(b)=5fbff79c,address(c)=5fbff79b
c=1,q=2049
Program ended with exit code: 0
q取了 c (5fbff79b)  (00000001)然后还有一个位置 就顺着下去把b(5fbff79c)(00001000) 给取了 .然后合起来 就是0000000100001000=2049(10进制)。
但是 我又有一个问题 为什么 刚刚好 b的地址和c的地址是相邻的(而且b在c的后面) 而且我这边的编译器也是   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-21 19:24:53 | 显示全部楼层
好人 发表于 2016-8-21 19:15
谢谢 我测试了一下 明白了  
address(b)=5fbff79c,address(c)=5fbff79b
c=1,q=2049

局部变量分配内存的时候栈指针ESP减去一定的大小
所以局部变量的地址都是一个挨着一个的线性地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 08:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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