C语言——数组与指针进阶(一)

对于刚接触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计算数组的值时,有一下两种情况:

  1. sizeof(数组名),即sizeof(arr),此时计算的是整个数组arr的大小,结果是:5*4 = 24;
  2. 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语言在使用过程中需要注意的事项。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值