黑马程序员技术交流社区
标题: 按顺序定义的变量,地址是由规律的? [打印本页]
作者: 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
恩,可能所有这样定义的变量,都是这样吧。
作者: dio925_heima 时间: 2015-3-13 19:37
你就当那个是固定语法把,因为定义指针p的时候,指向的是int类型,int类型占4个字节内存,所以p-1就代表在p所储存的内存地址基础上减去一个int类型大小的地址,也就是内存地址减去4,p-2就是减去两个int类型大小的地址,也就是内存地址-8
作者: 岳挺 时间: 2015-3-13 20:18
p = &a,p得到的就是a的内存地址吧,而一个整型占4个字节,为什么不是p - 4取到b的地址呢?
作者: hero200521296bj 时间: 2015-3-13 20:56
我觉得是指针-1,代表移动一位。
就像
int a[],*p;
p = &a;
*(p+1)取的就是a[1]的值
作者: 岳挺 时间: 2015-3-13 21:02
如果这样解释的话确实说的过去,但是究竟如何- -
好想知道
作者: hero200521296bj 时间: 2015-3-13 21:06
我也好想求证,呵呵。只是无聊的时候发现有这个规律。
作者: 喧闹的世界 时间: 2015-3-13 22:00
一看就是没有好好看视频的孩子,首先你定义a,b,c的时候内存是按由大到小分配的,每个int 4个字节。指针的加减是按照他内心来决定他加减的字节的。这个关于用指针来遍历数组里面有,你可以字节去看看
作者: hero200521296bj 时间: 2015-3-13 23:40
内心?没打错字吗?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |