黑马程序员技术交流社区

标题: 按顺序定义的变量,地址是由规律的? [打印本页]

作者: hero200521296bj    时间: 2015-3-13 16:27
标题: 按顺序定义的变量,地址是由规律的?
本帖最后由 hero200521296bj 于 2015-3-13 16:30 编辑

void Change(int *p){
    *(p-1) = 5;
    *(p-2) = 8;
}

int main(int argc, const char * argv[])
{
    int a = 10,b = 20,c =30;
    printf("a = %d,b = %d,c = %d\n",a,b,c);
    Change(&a);
    printf("a = %d,b = %d,c = %d\n",a,b,c);
}


运行的结果如下:
a = 10,b = 20,c = 30

a = 10,b = 5,c = 8

主函数里并没有给b、c赋值,但是通过指针p-1,p-2的地址真的可以改变b、c的值,是因为连续定a,b,c吗?


作者: 岳挺    时间: 2015-3-13 18:46
abc三个变量是连续定义的,在内存中的地址是abc三个由高到低依次分配的,这是我所知道,但是为什么*(p - 1)取到b的地址,*(p - 2)取到c的地址,我就不知道了
作者: hero200521296bj    时间: 2015-3-13 19:27
岳挺 发表于 2015-3-13 18:46
abc三个变量是连续定义的,在内存中的地址是abc三个由高到低依次分配的,这是我所知道,但是为什么*(p - 1 ...

恩,可能所有这样定义的变量,都是这样吧。
作者: dio925_heima    时间: 2015-3-13 19:37
岳挺 发表于 2015-3-13 18:46
abc三个变量是连续定义的,在内存中的地址是abc三个由高到低依次分配的,这是我所知道,但是为什么*(p - 1 ...

你就当那个是固定语法把,因为定义指针p的时候,指向的是int类型,int类型占4个字节内存,所以p-1就代表在p所储存的内存地址基础上减去一个int类型大小的地址,也就是内存地址减去4,p-2就是减去两个int类型大小的地址,也就是内存地址-8
作者: 岳挺    时间: 2015-3-13 20:18
dio925_heima 发表于 2015-3-13 19:37
你就当那个是固定语法把,因为定义指针p的时候,指向的是int类型,int类型占4个字节内存,所以p-1就代表 ...

p = &a,p得到的就是a的内存地址吧,而一个整型占4个字节,为什么不是p - 4取到b的地址呢?
作者: hero200521296bj    时间: 2015-3-13 20:56
岳挺 发表于 2015-3-13 20:18
p = &a,p得到的就是a的内存地址吧,而一个整型占4个字节,为什么不是p - 4取到b的地址呢? ...

我觉得是指针-1,代表移动一位。
就像
int a[],*p;
p = &a;
*(p+1)取的就是a[1]的值
作者: 岳挺    时间: 2015-3-13 21:02
hero200521296bj 发表于 2015-3-13 20:56
我觉得是指针-1,代表移动一位。
就像
int a[],*p;

如果这样解释的话确实说的过去,但是究竟如何- -
好想知道
作者: hero200521296bj    时间: 2015-3-13 21:06
岳挺 发表于 2015-3-13 21:02
如果这样解释的话确实说的过去,但是究竟如何- -
好想知道

我也好想求证,呵呵。只是无聊的时候发现有这个规律。
作者: 喧闹的世界    时间: 2015-3-13 22:00
一看就是没有好好看视频的孩子,首先你定义a,b,c的时候内存是按由大到小分配的,每个int 4个字节。指针的加减是按照他内心来决定他加减的字节的。这个关于用指针来遍历数组里面有,你可以字节去看看
作者: hero200521296bj    时间: 2015-3-13 23:40
喧闹的世界 发表于 2015-3-13 22:00
一看就是没有好好看视频的孩子,首先你定义a,b,c的时候内存是按由大到小分配的,每个int 4个字节。指针的加 ...

内心?没打错字吗?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2