|
|
发表于 2026-4-5 10:15:07
|
显示全部楼层
本帖最后由 xiaotubie 于 2026-4-9 14:33 编辑
如果a是数组,那么a[i]和*(a+i)都是获取数组的第i个元素,并不是取地址。当a是二维数组,你打印出来是地址,是因为数组对象在表达式中会隐式转换为首元素指针
看下面的代码,我故意用匿名数组,防止有人说数组名就是指针这种错误的说法,数组名肯定是代表的数组,切记!
- printf("0号子数组的地址:%p,0号子数组的大小:%zu\n", (int[2][3]) { 1, 2, 3,4,5,6 }[0] , sizeof ((int[2][3]) { 1, 2, 3, 4, 5, 6 }[0]));
- printf("0号子数组的地址:%p,0号子数组的大小:%zu", *(int[2][3]) { 1, 2, 3, 4, 5, 6 }, sizeof *(int[2][3]) { 1, 2, 3, 4, 5, 6 });
复制代码
二维数组不管用[ ]还是*运算符,得到的其实都是子数组,只不过表达式中它隐式转换为了首元素指针(地址),你看着以为得到的是地址
一维数组[]和*运算符得到的是子元素int对象,不存在隐式转换,所以看到就是元素值
一个int类型的a和float类型的b 相加,a会隐式转换成float类型,这个隐式转换我们无法直接看见,但你不能说a就是float类型
很多人错误的认为一维数组名就是一级指针 二维数组名就是二级指针,如果它真是一个指针 当你sizeof的时候 得到的应该是一个地址大小 而不是数组的大小,而他们还认为这是特殊情况。
编程语言中,有各种数据类型的对象,我们给对象创建了一个名字来代表。数组就是一些同类型数据按一定顺序排列起来的集合,取一个名字,数组名。而有些人却说它不表示数组,表示指针,数组和指针都不是一个东西。
C语言中 用指针来表示某种类型数据的地址,如果知道数组的地址,就可以很好的使用它了。但是怎么把数组和地址关联起来,使用又方便呢?因此约定,如果需要访问数组数据时,让数组对象直接隐式转换为首元素的指针。
而且其实下标运算符[ ] 也是指针运算符(不是数组),是*运算符的一种简便书写方式,因为存在数组对象到指针的隐式转换,所以也可以写 数组对象[i] 。这个数组对象可以匿名的,也可以带名字的(数组名)
|
|