探查数组的秘密

前面我们大致了解了下C语言中的字符串其实就是字符组成的数组,那么,要弄明白字符串,看来是不得不搞清楚数组了,还是看例子先:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main(){
int a[10];
int *p1 = a;
void *p2 = &a;
int *p3 = &a[0];
printf("p1:%d----p1+1:%d\n",p1,p1+1);
printf("p2:%d----p2+1:%d\n",p2,p2+1);
printf("&a:%d----&a+1:%d\n",&a,&a+1);
printf("p3:%d----p3+1:%d\n",p3,p3+1);
}

以上代码输出结果:

1
2
3
4
p1:-1175211504—-p1+1:-1175211500
p2:-1175211504—-p2+1:-1175211503
&a:-1175211504—-&a+1:-1175211464
p3:-1175211504—-p3+1:-1175211500

观察p1和p1+1的,发现,p1+1比p1大4,也就是p1+1,指针p1移动了4个字节。

观察p2和p2+1的,发现,p2+1比p2大4,也就是p1+1,指针p1移动了1个字节。

观察&a和&a+1的,发现,&a+1比&a大4,也就是&a+1,指针&a移动了40个字节。

观察p3和p3+1的,发现,p3+1比p3大4,也就是p3+1,指针p3移动了4个字节。

结论: 1、数组名等效于数组的首元素取地址,即,对于数组a[10],在写代码时,a与&a[0]是等效的。 2、&a步长为40,代表指针偏移了整个数组那么长,因为整个数组所占的字节数为40; 3、p2与&a分别+1结果的不同,说明了,指针运算中的步长偏移量与指针所指向的内存空间的类型有关。第8行,由于强制规定了指针为void * 型,所以步长变成了1. 4、指针是一种数据类型,在不进行强制转换的情况下,指针的数据类型与他所指向的内存空间的数据类型一致。