我知道,一个数组衰变为指针,例如,如果一个声明
char things[8];
再后来所用things
别的地方, things
是一个指针阵列中的第一个元素。
此外,从我的理解,如果一个人声明
char moreThings[8][8];
然后moreThings
不是类型的指针到char但类型的“指向char的阵列”,因为衰减只发生一次。
当moreThings
被传递给函数(原型说void doThings(char thingsGoHere[8][8])
什么是真正回事栈?
如果moreThings
是指针类型的不是,那么这是真的还是一个传递引用? 我想我一直认为moreThings
仍代表的多维数组的基址。 如果doThings
了输入thingsGoHere
和它本身传递给另一个函数?
是规则相当多,除非一个指定数组输入作为const
,则阵列将永远是修改?
我知道类型检查的东西只发生在编译的时候,但我仍然感到困惑的是什么引用技术上算作合格(即是它,只有当指针类型的参数传递,或将指针数组是pass-通过引用,以及?)
对不起,是一个小遍这个问题的地方,但因为我的理解这个困难的,很难说出一个精确的查询。
你得到了它稍有不妥: 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
这表明,不同的对象可以有相同的地址,但如果两个对象具有相同的地址和相同类型的,那么他们是同一个对象。
通过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.
&一个1 - >通过将整个阵列尺寸移动指针。 即:400个字节
&一个[0] + 1 - >通过将列的大小移动指针。 即:40个字节。
4个字节: - &一个[0] [0] 1>通过将元件即的大小移动指针。
[INT大小为4个字节]
希望这可以帮助。 :)