数组名

来源:互联网 发布:exe电子书反编译软件 编辑:程序博客网 时间:2024/04/27 13:29

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与指针》,里面有关于数组和指针的精彩论述

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


原创粉丝点击