好人 发表于 2016-8-21 02:26:29

关于指针

本帖最后由 好人 于 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.。。)
这是为什么?
{:5_92:}

迷雾少年 发表于 2016-8-21 09:37:48

c是1字节的int是4字节 你把c的地址给q那么*q的时候就取的是c的地址处的4个字节
比如c的地址是(0010)
0010   1
那么你把c的地址给qq指向0010
但是*q的时候取的0010 0011 0012 0013四个字节

好人 发表于 2016-8-21 14:38:28

迷雾少年 发表于 2016-8-21 09:37
c是1字节的int是4字节 你把c的地址给q那么*q的时候就取的是c的地址处的4个字节
比如c的地址是(0010)
...

但是 那个 0011 00120013 我没有给他值 。他为什么还输出是2049

迷雾少年 发表于 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内存浏览器浏览下这个地址就一目了然了

好人 发表于 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

好人 发表于 2016-8-21 16:14:10

d=1600416283(也是很奇怪 为什么不是只有8位)

迷雾少年 发表于 2016-8-21 16:15:19

好人 发表于 2016-8-21 16:10
我原代码有误
代码是这个
在b=8 的情况下才是 2049

这个有点复杂 不同机器不同编译器结果不一样总之就是你的q指针读的内容不止是那个c的数据 连还一直读下去读到b的数据一部分 所以你改b=7就是2049
我这里输出的完全和你不一样 新手的话就别折腾这了。。你开个CE内存浏览器 输出各个变量的值就一目了然了。。

好人 发表于 2016-8-21 16:26:55

本帖最后由 好人 于 2016-8-21 16:29 编辑

f

好人 发表于 2016-8-21 16:28:04

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

好人 发表于 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'

好人 发表于 2016-8-21 16:35:24

http://www.cnblogs.com/kenshincui/p/3848442.html
这是别人的解释 我看不懂。 在第一个例子中 的下面 他也是输出2049

迷雾少年 发表于 2016-8-21 16:37:07

好人 发表于 2016-8-21 16:14
d=1600416283(也是很奇怪 为什么不是只有8位)

你这是64位程序了吧。。。地址64位

迷雾少年 发表于 2016-8-21 16:44:59

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

他那是16位编译器
int2 字节
int*指针读2 字节
读取的时候把c(1字节) 和b (有2字节,但是因为读了c 所以只读b的1字节)都读了出来 所以变成 了那么个数

好人 发表于 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的后面) 而且我这边的编译器也是   

迷雾少年 发表于 2016-8-21 19:24:53

好人 发表于 2016-8-21 19:15
谢谢 我测试了一下 明白了
address(b)=5fbff79c,address(c)=5fbff79b
c=1,q=2049


局部变量分配内存的时候栈指针ESP减去一定的大小
所以局部变量的地址都是一个挨着一个的线性地址
页: [1]
查看完整版本: 关于指针