C语言|关于数组名

前言 【C语言|关于数组名】数组名的意义:

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址。
程序源码
/*经典面试题*/#if 1 #include int main() {//一维数组 int a[]={ 1,2,3,4}; printf("%d\n",sizeof(a)); //4*4 = 16 printf("%d\n",sizeof(a+0)); //4/8,a在这里是首元素地址,a+0还是首元素地址 printf("%d\n",sizeof(*a)); //4,a[0] printf("%d\n",sizeof(a+1)); //4/8,&a[1] printf("%d\n",sizeof(a[1])); //4 printf("%d\n",sizeof(&a)); //4/8,&a取出的是数组的地址,数组的地址也是地址 printf("%d\n",sizeof(*&a)); //16,sizeof(a); printf("%d\n",sizeof(&a+1)); //4/8,&a是数组的地址,&a+1虽然跳过整个数组,但是地址 printf("%d\n",sizeof(&a[0])); //4/8第一个元素的地址 printf("%d\n",sizeof(&a[0]+1)); //4/8第二个元素的地址return 0; } #endif#if 0 #include int main() { //字符数组 char arr[]={ 'a','b','c','d','e','f'}; printf("%d\n",sizeof(arr)); //6 printf("%d\n",sizeof(arr+0)); //8/4,arr+0是首元素地址 printf("%d\n",sizeof(*arr)); //1,a[0] printf("%d\n",sizeof(arr[1])); //1 printf("%d\n",sizeof(&arr)); //8/4,数组的地址 printf("%d\n",sizeof(&arr+1)); //8/4,&arr+1跳过整个数组后的地址 printf("%d\n",sizeof(&arr[0]+1)); //8/4,&arr[1]->地址return 0; } #endif#if 0 #include #include int main() {//字符数组 char arr[]={ 'a','b','c','d','e','f'}; printf("%d\n",strlen(arr)); //随机值6,无法确定'\0'在哪 printf("%d\n",strlen(arr+0)); //随机值 //printf("%d\n",strlen(*arr)); //err,访问地址97 //printf("%d\n",strlen(arr[1])); //errr,'b' printf("%d\n",strlen(&arr)); //随机值 printf("%d\n",strlen(&arr +1)); //随机值-6 printf("%d\n",strlen(&arr[0]+1)); //随机值-1 return 0; }#endif#if 0 #include #include int main() {char arr[]="abcdef"; printf("%d\n",sizeof(arr)); //7 printf("%d\n",sizeof(arr+0)); //8/4 printf("%d\n",sizeof(*arr)); //1 printf("%d\n",sizeof(arr[1])); //1 printf("%d\n",sizeof(&arr)); //8/4 printf("%d\n",sizeof(&arr+1)); //8/4 printf("%d\n",sizeof(&arr[0]+1)); //8/4printf("\n"); printf("%d\n",strlen(arr)); //6 printf("%d\n",strlen(arr+0)); //6,首元素地址 //printf("%d\n",strlen(*arr)); //err,arr[0]不是地址 //printf("%d\n",strlen(arr[1])); //err printf("%d\n",strlen(&arr)); //6,w类型不匹配 printf("%d\n",strlen(&arr +1)); //随机值,w printf("%d\n",strlen(&arr[0]+1)); //5,从&a[1]开始算return 0; } #endif#if 0 #include #include int main() {char *p="abcdef"; //p存放的是a的地址 printf("%lu\n",sizeof(p)); //8/4,计算指针变量的大小 printf("%lu\n",sizeof(p+1)); //8/4,'b'的地址 printf("%lu\n",sizeof(*p)); //1,'a'的大小 printf("%lu\n",sizeof(p[0])); //1,'a'的大小 printf("%lu\n",sizeof(&p)); //4/8,指针变量的地址的大小 printf("%lu\n",sizeof(&p+1)); //4/8, printf("%lu\n",sizeof(&p[0]+1)); //4/8printf("*********************************\n"); printf("%u\n",strlen(p)); //6 printf("%u\n",strlen(p+1)); //5 //printf("%u\n",strlen(*p)); //err //printf("%u\n",strlen(p[0])); //err printf("%u\n",strlen(&p)); //随机值 printf("%u\n",strlen(&p+1)); //随机值 printf("%u\n",strlen(&p[0]+1)); //5,&p[1]为起点return 0; } #endif#if 0 #include int main() {//二维数组 //48 4 16 8 4 8 16 8 16 16 16 int a[3][4]={ 0}; printf("&a[0][0]=%p\n",&a[0][0]); printf("a[0]+1=%p\n",a[0]+1); printf("%lu\n",sizeof(a)); //4*3*4=48,这个数组的大小 printf("%lu\n",sizeof(a[0][0])); //4,第一个元素的大小 printf("%lu\n",sizeof(a[0])); //4*4=16,a[0]=*a,a[0]表示第一行的首地址,可以看成一个维数组,数组名为a[0],第一行的大小 printf("%lu\n",sizeof(a[0]+1)); //8/4,a[0]是第一行的数组名,此时的数组名是首元素的地址,a[0]+1是第一行第二个元素的地址 printf("%lu\n",sizeof(*(a[0]+1))); //4,第一行第2个元素的大小 printf("%lu\n",sizeof(a+1)); //8/4,a是二维数组的数组名,a+1是第二行的首地址, printf("%lu\n",sizeof(*(a+1))); //4*4=16,sizeof(a[1])计算第二行的大小 printf("%lu\n",sizeof(&a[0]+1)); //8/4,第二行的地址, printf("%lu\n",sizeof(*(&a[0]+1))); //4*4=16 printf("%lu\n",sizeof(*a)); //4*4=16,第一行首元素的地址a[0],即第一行的数组的大小 printf("%lu\n",sizeof(a[3])); //16,第四行的首地址,即第四行的数组的大小return 0; } #endif

    推荐阅读