超凡天赐 发表于 2017-4-8 16:21:21

关于地址的理解

#include <stdio.h>
int main()
{
    int *p,*q;
    int a={1,2};
    p=&a;
    q=p+1;
    printf("%ld\n",p);
    printf("%ld\n",q);
    printf("%ld\n",q-p);
    return 0;
}
输出第一行是
140734799804192
输出第二行是
140734799804196
输出第三行是
1
我一开始认为第三行输出的4,请问一下这是为什么?

超凡天赐 发表于 2017-4-8 16:26:15

@人造人 @zealstar 先召唤大神

人造人 发表于 2017-4-8 17:05:05


http://blog.sina.com.cn/s/blog_5fb3f12501016jiy.html

超凡天赐 发表于 2017-4-8 19:24:46

人造人 发表于 2017-4-8 17:05
http://blog.sina.com.cn/s/blog_5fb3f12501016jiy.html

你的博客?

人造人 发表于 2017-4-8 19:26:56

超凡天赐 发表于 2017-4-8 19:24
你的博客?

不是

zealstar 发表于 2017-4-9 09:47:17

指针的加减运算是以指针指向的数据类型为基本单位的

既然 p=q+1,那么p-q == 1
至少C语言的创造者是这样来让逻辑合理的。{:10_245:}

超凡天赐 发表于 2017-4-9 20:32:55

zealstar 发表于 2017-4-9 09:47
指针的加减运算是以指针指向的数据类型为基本单位的

既然 p=q+1,那么p-q == 1


可是为什么我用%d来打印p会警告,而用%d来打印p-q就不会警告,原谅我的钻牛角尖{:10_256:}

超凡天赐 发表于 2017-4-9 20:40:30

zealstar 发表于 2017-4-9 09:47
指针的加减运算是以指针指向的数据类型为基本单位的

既然 p=q+1,那么p-q == 1


我先来自问自答一下,原因是p的量是一个地址值,在语法上不能用%d来打印。而p-q表示的就是个数,可以用%d

zealstar 发表于 2017-4-10 18:19:58

超凡天赐 发表于 2017-4-9 20:40
我先来自问自答一下,原因是p的量是一个地址值,在语法上不能用%d来打印。而p-q表示的就是个数,可以用%d

你这不是已经懂了么……{:10_277:},正解就是这样,别的语言也会这样处理。本来嘛,除汇编以外的语言都是为了方便人操作,不用手工计算地址和跨度问题,所以才这样编制的。

Caleb 发表于 2017-4-12 12:09:04

学习了,谢谢

超凡天赐 发表于 2017-4-14 10:51:18

@qq1242009750 @四十二 来领鱼币

qq1242009750 发表于 2017-4-14 16:34:12

超凡天赐 发表于 2017-4-14 10:51
@qq1242009750 @四十二 来领鱼币

来了

四十二 发表于 2017-6-23 15:21:27

哎呀我来晚了~

看来您老人家应该已经解决了吧{:10_277:}
页: [1]
查看完整版本: 关于地址的理解