为了账号安全,请及时绑定邮箱和手机立即绑定

指向指针衰减的数组,并将多维数组传递给函数

指向指针衰减的数组,并将多维数组传递给函数

C
qq_花开花谢_0 2019-10-19 14:03:47
我知道数组会衰减为指针,因此如果声明了char things[8];然后在things其他地方使用,things是指向数组中第一个元素的指针。另外,据我了解,如果有人宣布char moreThings[8][8];则moreThings其类型不是指向char的指针,而是类型为“指向char的指针的数组”,因为衰减仅发生一次。什么时候moreThings传递给函数(例如使用原型void doThings(char thingsGoHere[8][8]),堆栈实际发生了什么?如果moreThings不是指针类型,那么这真的仍然是引用传递吗?我想我一直认为它moreThings仍然代表多维数组的基址。如果doThings接受输入thingsGoHere并将其自身传递给另一个函数怎么办?除非有人指定一个数组输入,否则该规则const将始终是可修改的,这是否就是规则?我知道类型检查工作仅在编译时发生,但是我仍然对从技术上算作按引用传递(即仅在传递类型为指针的参数时才将其视为传递,还是将指针数组传递为传递对象而感到困惑)感到困惑也可以参考吗?)很抱歉,这个问题到处都是,但是由于我很难理解这个问题,所以很难表达出确切的询问。
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

您略有错误:它moreThings还会衰减到第一个元素的指针,但是由于它是一个字符数组的数组,因此第一个元素是“ 8个字符数组”。因此,衰减的指针是这种类型的:


char (*p)[8] = moreThings;

的值的指针的当然是相同的值&moreThings[0][0],即,第一元件的第一元件,并且也相同的&a,但类型是不同的一个在每种情况下。


这是一个例子,如果char a[N][3]:


+===========================+===========================+====

|+--------+--------+-------+|+--------+--------+-------+|

|| a[0,0] | a[0,1] | a[0,2]||| a[1,0] | a[1,1] | a[1,2]|| ...

|+--------+--------+-------+++--------+--------+-------++ ...

|            a[0]           |            a[1]           |

+===========================+===========================+====

                                    a

^^^

||+-- &a[0,0]

|+-----&a[0]

+-------&a

&a:整个字符数组的地址,它是一个 char[N][3]


&a[0],与a:第一个元素的地址相同,它本身就是一个char[3]


&a[0][0]:第一个元素的第一个元素的地址,即 char


这表明不同的对象可能具有相同的地址,但是如果两个对象具有相同的地址和相同的类型,则它们是相同的对象。


查看完整回答
反对 回复 2019-10-19
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

Kerrek很好地解释了


除此之外,我们可以通过以下示例证明这一点:


#include <stdio.h>


int main ()

{

 int a[10][10];


 printf (".. %p  %p\n", &a, &a+1);

 printf (".. %p  %p \n ", &a[0], &a[0]+1);

printf (".. %p   %p \n ", &a[0][0], &a[0][0] +1);

}

输出为:


.. 0x7fff6ae2ca5c  0x7fff6ae2cbec    = 400 bytes difference

.. 0x7fff6ae2ca5c  0x7fff6ae2ca84    = 40 bytes difference

 .. 0x7fff6ae2ca5c   0x7fff6ae2ca60  = 4 bytes difference. 

&a +1->通过增加整个数组大小来移动指针。即:400个字节


&a [0] + 1->通过增加列的大小来移动指针。即:40个字节。


&a [0] [0] +1->通过添加元素的大小(即4个字节)来移动指针。


[int大小为4个字节]


希望这可以帮助。:)


查看完整回答
反对 回复 2019-10-19
  • 3 回答
  • 0 关注
  • 370 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信