数组小探

定义一个数组:

int a[5] = {1, 2, 3, 4, 5};

进行如下操作:

a, &a, &a[0]

1.问:各代表什么?

答:

a 等价于 &a[0] 等价于 第0个元素的地址

&a 等价于 数组a的地址

2.再问:请指出它们之间的实际区别。

答:请看代码:

// THE PROGRAM IS MADE BY PYY // Copyright (c) 2011 panyanyany All rights #include <iostream> #include <stdio.h> #include <conio.h> using namespace std; int main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a[0]+1); printf("%d/t%d -- add %d bytes/n", a, a+1, ((int)(a+1)-(int)a)/sizeof(int)); printf("%d/t%d -- add %d bytes/n", &a, &a+1, ((int)(&a+1)-(int)(&a))/sizeof(int)); printf("%d/t%d -- add %d bytes/n", &a[0], &a[0]+1, ((int)(&a[0]+1)-(int)(&a[0]))/sizeof(int)); return 0; }

显示结果是:

// THE PROGRAM IS MADE BY PYY // Copyright (c) 2011 panyanyany All rights 虽然 a,&a,&a[0] 的内存地址是相同的,但它们的意思已经大不相同了。 可见如果对 a 进行自加操作,a+1 使指向 a 的指针向后移动一个 int 位,即 4 字节; 如果对 &a 进行自加操作,&a+1 使指向 a 的指针向后移动一个 数组 位,即 4*5 = 20 字节,也即是数组a[5]的内存大小; 如果对 &a[0] 进行自加操作,等价于 a 。

&a 和 a 虽然数值一样,但系统在系统看来就是不同的东西了

系统会偷偷地给 &a 标记为:数组的地址
然后给 a 标记为:元素的地址

就像外人分不清双胞胎一样,熟人却可以分清楚哪个是哥哥,哪个是弟弟,因为他们已经在心里默默地给双胞胎标上了记号。

知识拓展:当执行下列操作的时候,会出现什么情况呢?

printf("%d/t%d/n", &a+1, (int*)&a+1);

// THE PROGRAM IS MADE BY PYY // Copyright (c) 2011 panyanyany All rights #include <iostream> #include <stdio.h> #include <conio.h> using namespace std; int main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a[0]+1); printf("%d/t%d -- add %d bytes/n", a, a+1, ((int)(a+1)-(int)a)/sizeof(int)); printf("%d/t%d -- add %d bytes/n", &a, (int*)&a+1, ((int)((int*)&a+1)-(int)(&a))/sizeof(int)); return 0; }

发现结果和 上一句的一样了!为什么呢?

因为 &a 原本在系统中是被标记为 “数组的地址”,而且经过(int*)强制转换后,变成了 “整型变量的地址”。数组的地址自加,会跨越整个数组,即 4*5 = 20 个字节,而整型变量的地址自加,只能跨越一个整型变量,即 1 个字节.

当然,我们也可以进行逆向操作。即

(int (*)[5])a+1

// THE PROGRAM IS MADE BY PYY // Copyright (c) 2011 panyanyany All rights reserved. #include <iostream> #include <stdio.h> #include <conio.h> using namespace std; int main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a[0]+1); printf("%d/t%d -- add %d bytes/n", a, a+1, ((int)(a+1)-(int)a)/sizeof(int)); printf("%d/t%d -- add %d bytes/n", a, (int(*)[5])a+1, ((int)((int(*)[5])a+1)-(int)a)/sizeof(int)); return 0; }

看!现在成功地把 a ---“元素的地址”, 转化成了 “数组的地址”,这时它再自加,就不是自加一个整型变量了,而是一整个数组!

注意:(int *[5])a 和 (int (*)[5])a 是不同的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值