A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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吗?

9 个回复

倒序浏览
abc三个变量是连续定义的,在内存中的地址是abc三个由高到低依次分配的,这是我所知道,但是为什么*(p - 1)取到b的地址,*(p - 2)取到c的地址,我就不知道了
回复 使用道具 举报
岳挺 发表于 2015-3-13 18:46
abc三个变量是连续定义的,在内存中的地址是abc三个由高到低依次分配的,这是我所知道,但是为什么*(p - 1 ...

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

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

p = &a,p得到的就是a的内存地址吧,而一个整型占4个字节,为什么不是p - 4取到b的地址呢?
回复 使用道具 举报
岳挺 发表于 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:34
7#
hero200521296bj 发表于 2015-3-13 20:56
我觉得是指针-1,代表移动一位。
就像
int a[],*p;

如果这样解释的话确实说的过去,但是究竟如何- -
好想知道
回复 使用道具 举报
岳挺 发表于 2015-3-13 21:02
如果这样解释的话确实说的过去,但是究竟如何- -
好想知道

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

内心?没打错字吗?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马