对于刚接触C语言数组的人来说,很容易混淆数组和指针间的关系。本文根据自身在学习数组和指针的相关总结
一、数组名的含义
数组名总的来说其有两层含义:一是数组名代表整个数组;二是当其作为指针时数组名又将代表数组首元素的地址。
二、arr_name 与 &arr_name的区别
具体代码如下所示:
int main(void)
{
int arr[5];
int *p1 = arr; //作为指针,代表数组arr[5]首元素arr[0]的地址
int *p2 = &arr; //代表整个数组的地址
/*********(1)sizeof的应用 ************/
printf("sizeof(arr) = %d\n", sizeof(arr)); //结果是整个数组的大小5*4
printf("sizeof(&arr) = %d\n", sizeof(&arr)); //结果是4
/********(2)p+1的应用 ***************/
printf("p1+1 = %d\n",p1 + 1); //结果是数组arr首元素arr[0]的地址值
printf("p2+1 = %d\n",p2 + 1); //结果是数组首元素arr[0]的地址值 + 20
return 0;
}
arr_name:表示的是数组中第一个元素的地址;
&arr_name:表示的是整个数组的地址;
(1)数组名的特殊应用:
当使用sizeof计算数组的值时,有一下两种情况:
- sizeof(数组名),即sizeof(arr),此时计算的是整个数组arr的大小,结果是:5*4 = 24;
- sizeof(&数组名),即sizeof(&arr),此时计算的是数组arr中首元素arr[0]的地址,32位机中,一个地址就是一个32位的整型数,该结果也就是:4;
(2)由于指针p1、p2虽然指向的地址是一样的数组元素arr[0]的地址,但这两者所代表的含义是不一样的,以致这两者加1的结果也是不一样的。具体的关系可使用下图来理解:
三、数组作为参数
void fun1(int *a)
{
...
}
void main()
{
int a[5];
fun1(a[5]);
fun1(a);
fun1(&a);
.......
}
以上三个函数的调用,数组作为参数时,实际传入的数组名,三者并无区别,也就是当数组作为参数使用时,传入的实际上是这个数组的地址,而不是其数组元素的值。
C语言使用数组的过程中还有许多细节,以上只是个人所学的总结,难免有疏漏,在这里向大家推荐一本关于在嵌入式编程中的高级C语言《高质量嵌入式Linux C编程》,这里有很详细的C语言在使用过程中需要注意的事项。