ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

从例题中深入理解数组名的含义

2021-09-03 14:49:13  阅读:150  来源: 互联网

标签:arr 含义 地址 数组名 数组 printf sizeof 例题


首先,我们先要了解数组名的意义:
数组名的意义:

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址
    在此再说明一点:strlen-是库函数,求的是字符串长度
    sizeof-是操作符,单位是字节,是求变量所占空间的大小,或者是求类型创建的变量所占空间的大小。
    首先来看一维数组:
#include <stdio.h>
	int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a)); //16
	//数组名a单独放在sizeof内部,数组名表示整个数组,计算的是整个数组的大小
	printf("%d\n", sizeof(a + 0));//4/8
	//a表示首元素的地址,a+0还是首元素的地址,地址的大小是4/8字节
	printf("%d\n", sizeof(*a));  //4
	 //a表示首元素的地址,*a 就是首元素 ==> a[0] ,大小就是4
	 //*a <==> *(a+0) <==> a[0]
	printf("%d\n", sizeof(a + 1));//4/8
	//a表示首元素的地址,a+1是第二个元素的地址,大小就是4/8
	printf("%d\n", sizeof(a[1]));//4
	 //a[1] 就是第二个元素 - 4
	printf("%d\n", sizeof(&a));  //4/8
	 //&a - 数组的地址 - 4/8 - int(*)[4]
	printf("%d\n", sizeof(*&a)); 
	 //*&a - &a是数组的地址,对数组的地址解引用拿到的是数组,所以大小是16
	 //printf("%d\n", sizeof(a));//16
	printf("%d\n", sizeof(&a + 1));//4/8
	// &a是数组的地址,&a+1 是数组的地址+1,跳过整个数组,虽然跳过了数组,
	//还是地址  4/8
	printf("%d\n", sizeof(&a[0]));//4/8
	printf("%d\n", sizeof(&a[0] + 1));//第二个元素的地址 4/8
	return 0;
}

再来看一组字符数组:

int main()
{
	char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
	printf("%d\n", sizeof(arr));//6
	//数组名表示整个数组,计算的是整个数组的大小
	printf("%d\n", sizeof(arr + 0));//4/8  
	//数组名是首元素的地址,arr+0还是首元素的地址
	printf("%d\n", sizeof(*arr));//1   首元素的大小。
	printf("%d\n", sizeof(arr[1]));//1  数组第2个元素的大小
	printf("%d\n", sizeof(&arr));//4/8  
	//数组名表示整个数组,取出的是整个数组的地址
	printf("%d\n", sizeof(&arr + 1));//4/8 &arr + 1跳过整个数组的地址
	printf("%d\n", sizeof(&arr[0] + 1));//4/8  数组第二个元素的地址

    printf("%d\n", strlen(arr));//随机值  
    //strlen-是库函数,求的是字符串长度
	printf("%d\n", strlen(arr + 0));//随机值
	//printf("%d\n", strlen(*arr));//*arr - 'a' - 97 - err
	//strlen就以为传进来的'a'的ascii码值97就是地址
	//printf("%d\n", strlen(arr[1]));//'b' - 98 - err
	printf("%d\n", strlen(&arr));//随机值
	//char(*)[6]
	printf("%d\n", strlen(&arr + 1));//随机值
	printf("%d\n", strlen(&arr[0] + 1));//随机值
	return 0;
}
int main()
{
    char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//7 字节
	printf("%d\n", sizeof(arr + 0));//arr是首元素的地址。arr+0还是首元素的地址 4/8
	printf("%d\n", sizeof(*arr));//arr是首元素的地址,*arr就是首元素 1
	printf("%d\n", sizeof(arr[1]));//arr[1]就是第二个元素  1
	printf("%d\n", sizeof(&arr));//&arr 是数组的地址,数组的地址也是地址,就是4/8字节
	printf("%d\n", sizeof(&arr + 1));//&arr 是数组的地址,&arr+1 是跳过整个数组后的地址 4/8
	printf("%d\n", sizeof(&arr[0] + 1));//&arr[0] + 1 是第二个元素的地址,4/8

    printf("%d\n", strlen(arr));//6 整个数组的长度
	printf("%d\n", strlen(arr + 0));//6  arr+0是首元素的地址
	//printf("%d\n", strlen(*arr));//err
	//printf("%d\n", strlen(arr[1]));//err
	printf("%d\n", strlen(&arr));//6 &arr-整个数组的地址
	printf("%d\n", strlen(&arr + 1));//随机值
	printf("%d\n", strlen(&arr[0] + 1));//5  &arr[0] + 1-第2个元素的地址
    return 0;
 }
int main()
	{
		const char* p = "abcdef";
		printf("%d\n", strlen(p));//6
		printf("%d\n", strlen(p + 1));//5
		//printf("%d\n", strlen(*p));//err
		//printf("%d\n", strlen(p[0]));//err
		printf("%d\n", strlen(&p));//随机值
		printf("%d\n", strlen(&p + 1));//随机值
		printf("%d\n", strlen(&p[0] + 1));//5

        printf("%d\n", sizeof(p));//p是一个指针变量 4/8
		printf("%d\n", sizeof(p + 1));//p+1 是字符b的地址 4/8
		printf("%d\n", sizeof(*p));//1
		printf("%d\n", sizeof(p[0]));// 1 p[0]-->*(p+0) --> *p 1
		printf("%d\n", sizeof(&p));//4/8
		printf("%d\n", sizeof(&p + 1));//4/8
		printf("%d\n", sizeof(&p[0] + 1));//4/8
	
	    return 0;
	}

最后,再来看一组二维数组:

int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));  //48   12x4
	printf("%d\n", sizeof(a[0][0]));//4  数组第一个元素的大小
	printf("%d\n", sizeof(a[0]));// 16 
	//a[0]表示第一行的数组名,数组名单独放在sizeof内部,计算的是第一行整个数组的大小
	printf("%d\n", sizeof(a[0] + 1));//4/8
	//a[0]表示第一行的数组名,没有单独放在sizeof内部,也没有&,所以arr[0]表示首元素地址
	//所以 就是第一行这个数组第一个元素的地址
	//a[0] + 1,就是第一行第2个元素的地址
	printf("%d\n", sizeof(*(a[0] + 1)));//4 就是第一行第二个元素
	printf("%d\n", sizeof(a + 1));//4/8
	//数组名a并没有单独放在数组内部,也没有&。所以a表示首元素(第一行)地址
	//所以a+1,就是第二行地址
	//int(*)[4]
	printf("%d\n", sizeof(*(a + 1)));//16 *(a+1)就是整个第二行
	//*(a + 1)-->a[1]
	printf("%d\n", sizeof(&a[0] + 1));//4/8    
	//&a[0]拿到的是第一行的地址,&a[0] + 1就是第二行的地址
	printf("%d\n", sizeof(*(&a[0] + 1)));//16  整个第二行
	printf("%d\n", sizeof(*a));//16  
	//a表示首元素的地址,就是第一行的地址,*a就是第一行-第一行的数组名
	printf("%d\n", sizeof(a[3]));//16 
	//a[3]假设存在,就是第四行的数组名,sizeof(a[3])就相当于把第四行的数组名单独放在sizeof内部
	return 0;
}

对于上面这个二维数组:a就是二维数组的数组名,第一行的数组名是a[0],第二行的数组名是a[1],第三行的数组名是a[2]。
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
这里对于二维数组同样适用。
&a:二维数组首元素(第一行)的地址
&a[0]:第一行第一个元素的地址
&a[1]:第二行第一个元素的地址
&a[2]:第三行第一个元素的地址

标签:arr,含义,地址,数组名,数组,printf,sizeof,例题
来源: https://blog.csdn.net/dddddrrrzz/article/details/120079167

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有