数组名

c语言当中最奇葩和精华的就数指针和数组了,这两个东西也是最能反映硬件底层的东西,所以经常搞得程序员很头大,

而这两者的“结合体”----数组名更是让人头疼,下面就来提出一些困惑。

1、数组名首先是一种常量,不能被修改

2、对于数组int a[6] ,&a和a的值相同,都是a[0]的地址,但是&a是个什么意思呢,是对a这种常量取地址吗?那为什么a的地址和它的值还相等呢?

这个问题可以这样看待,a有时指的是整个数组,而&a就是对数组取首地址,而有时a又像指针一样,a的值就是首地址

总之数组和指针有很多的不同,其复杂度应该是C语言总体复杂度的重要部分

3、sizeof(a)= 4*6=24,a指的是整个数组结构

      int *p = a ;  sizeof(p)=4,p是指针变量,所有指针变量所占据空间都是一样的

同样,对于二维数组a[2][3],有a和a[0]

int (*pt)[3] = a, int *p= a[0];sizeof(pt)= 4,sizeof(a)=24 ;sizeof(p)=4,sizeof(a[0])=12

先贴出实验结果吧

#include <stdio.h>
#include <conio.h>

int main()
{
	int a[2][3]={{1,2,3},{3,4,9}};
	int i;
	int *p;
	int (*pt)[3];
	for(i=0;i<2;i++)
	{
		int j;
		for(j=0;j<3;j++)
		{
			printf("a[%d][%d]: %d ",i,j,a[i][j]);
		}
		printf("\n");
	}

	printf("&a:%d,a:%d,*a:%d,**a:%d\n",&a,a,*a,**a);
	printf("sizeof(a):%d,sizeof(*a):%d,sizeof(**a):%d\n",sizeof(a),sizeof(*a),sizeof(**a));
	printf("sizeof(a[0]):%d,sizeof(a[0][0]):%d\n",sizeof(a[0]),sizeof(a[0][0]));
	printf("&a[0][0]:%d,a[0]:%d,&a[0]:%d\n",&a[0][0],a[0],&a[0]);

	p = a[0];
	pt = a;
	printf("a[1][2]:%d,*(p+5):%d,*(*(pt+1)+2):%d\n",a[1][2],*(p+5),*(*(pt+1)+2));
	printf("sizeof(p):%d,sizeof(pt):%d\n",sizeof(p),sizeof(pt));
	
	getch();
	return 0;
}


 


总结:指针其实不是很难理解,它就是一个变量而已,这种变量所占据的空间是一定的,不管指针的类型是int *、char *还是int *[3],sizeof(指针变量)都一样

 数组名的特殊含义注定它与众不同,这种不同主要是因为它统领着数组这种较为庞大的数据结构,数组名的用法还是亲自试验过才能明白其中的不同



推荐《C专家编程》《C与指针》,里面有关于数组和指针的精彩论述

有对数组名不同情况下的不同意义的总结,能解决不少疑惑


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值