资讯专栏INFORMATION COLUMN

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

FingerLiu / 1568人阅读

摘要:首先,我们先要了解数组名的意义数组名的意义数组名,这里的数组名表示整个数组,计算的是整个数组的大小。数组名,这里的数组名表示整个数组,取出的是整个数组的地址。这里对于二维数组同样适用。

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

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址
    在此再说明一点:strlen-是库函数,求的是字符串长度
    sizeof-是操作符,单位是字节,是求变量所占空间的大小,或者是求类型创建的变量所占空间的大小。
    首先来看一维数组:
#include 	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]:第三行第一个元素的地址

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119111.html

相关文章

  • 深入理解计算机系统》·深入浅出·快速理解第2章(3日完稿)

    摘要:写在前面博客主页的江湖背景的江湖背景欢迎关注点赞收藏留言本文由原创,首发首发时间年月日最新更新时间年月日坚持和努力一定能换来诗与远方向未见花闻学习参考书籍深入理解计算机系统作者水平很有限,如果发现错误,请留言轰炸哦万分感谢感谢感谢 ?写在前面 ?博客主页:kikoking的江湖背景?...

    YJNldm 评论0 收藏0
  • JavaScript之例题彻底理解this

    摘要:最后重点理解结论箭头函数的,总是指向定义时所在的对象,而不是运行时所在的对象。输出,箭头函数不会绑定所以传入指向无效。原因是,要彻底理解应该是建立在已经大致理解了中的执行上下文,作用域作用域链,闭包,变量对象,函数执行过程的基础上。 本文共 2025 字,看完只需 8 分钟 概述 前面的文章讲解了 JavaScript 中的执行上下文,作用域,变量对象,this 的相关原理,但是我...

    Hwg 评论0 收藏0
  • 【零基础趣学C语言】- 史上最全C语言函数详解(万字图文+代码演示+图解)

    摘要:语言在设计中考虑了函数的高效性和易用性两个原则。在语言中,最常见的当属函数了。以上就是一个函数,它被称为语言的入口函数,或者主函数。例如和都是函数名。形式参数当函数调用完成之后就自动销毁了。 ...

    468122151 评论0 收藏0

发表评论

0条评论

FingerLiu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<