我对C语言中数组本质的理解
2012-12-19 ODD
在单片机C语言程序设计中,在通信和数据采集应用中,都离不数组。对于长数据帧的出来还需要数组和指针的融合应用。
就本人的理解,数组和指针联系紧密,但有有所区别。
1.在C语言中,对于一个数组,我们只能做两件事情:
A. 确定该数组的大小(数组的大小必须在编译器就作为一个常数确定下来)
B. 获得指向该数组下标为0的元素的指针。(其他的数组操作,实际上都是通过指针进行的)
2. C语言中,数组的元素可以是任何类型的对象,也可以是另外一个数组。因此,二维数组实际上是元素为一维数组的一维数组。
例如: int a[12][31];
该语句声明了一个数组,该数组拥有12个数组类型的元素;其中每个元素都是一个拥有31个整型元素的数组。
3. 如果我们在应该出现指针的地方,采用数组名来替换,那么数组名就被当作指向该数组下表为0元素的指针。
例如: int *p;
int a[3];
p = a; //把数组a中下标为0的元素的地址赋值给p。
如果写成p = &a;在C语言中是非法的,因为&a是一个指向数组的指针,而p是一个指向整形变量的指针,它们的类型不匹配。
4. 如果一个指针指向的是一个数组中的元素,那么,给这个指针加1,就能得到指向数组下一个元素的指针。
注意:给一个指针加上一个整数,与给该指针的二进制表示加上同样的整数,两者截然不同。
例如:int *p; (假设int是4个字节,p指针的二进制表示为:0x00005611)
p+2,指针指向的内存位置为:0x00005619
二进制+2,指针指向内存为:0x00005613
5. int a[10];
*a = 8;就是将数组a中下标为0的元素的值设置为8。
同理,*(a+1)就是对数组小标为1的元素的引用。
以此类推,*(a+i)就是对数组a中下表我ii的元素的引用。这种用法相当常用,因此被简记为a。
所以,大家要知道实际上,a 的本质是 *(a+i)。