C `a`和`*a`之间有什么区别,其中`a`表示二维数组?
指针和数组彼此密切相关,因此,如果我们有一个二维数组C `a`和`*a`之间有什么区别,其中`a`表示二维数组?,c,arrays,pointers,multidimensional-array,syntax,C,Arrays,Pointers,Multidimensional Array,Syntax,指针和数组彼此密切相关,因此,如果我们有一个二维数组 int a[3][4]={ 1,2,3,4, 5,6,7,8, 9,10,11,12}; 两者 及 打印相同的地址。我所理解的可能是a指向a的基址,而*a指向二维数组a的第一个子数组 那么,两者的区别是什么呢 我得到的可能是a指向了一段时间的基址*a 指向二维数组a的第一个子数组 差不多了 a当您将其传递给printf时,它自身会衰减为指向其第一个子数组的指针(
int a[3][4]={
1,2,3,4,
5,6,7,8,
9,10,11,12};
两者
及
打印相同的地址。我所理解的可能是a
指向a
的基址,而*a
指向二维数组a
的第一个子数组
那么,两者的区别是什么呢
我得到的可能是a指向了一段时间的基址*a
指向二维数组a的第一个子数组
差不多了
当您将其传递给a
时,它自身会衰减为指向其第一个子数组的指针(类型为printf
)int(*)[3]
指定*a
的第一个子数组(类型为a
),并衰减到指向该子数组第一个元素的指针(类型为int[3]
)int*
最后,它们共享相同的值,因为数组递归地与第一个元素具有相同的地址。指针(数组衰减到)之间的差异不是地址而是类型 正如您所看到的,两个指针都指向相同的地址。但是
a
指向子数组,而*a
指向int
s
这会产生不同,例如在执行地址算术时
a+1
不同于*a+1
它非常简单*a
是一个整数数组。在您的情况下,除了数组[1,2,3,4]
中的*a
。可以通过(*a)[i]
访问此数组的各个元素,其中i
是所需元素的索引
a
是指向这个整数数组的指针a[0]
将为您提供第一个数组(与*a
相同),a[1]
将为您提供第二个数组(即[5,6,7,8]
)
例如,如果您想访问第5个元素(即
5
),它将a[1][0]
a
是一个大小为3x4的二维数组。这意味着:
sizeof(a)==3*4*sizeof(int)
是一个大小为4的1D数组(对于给定声明的0)a[i]
以下是事实:int a[3][4];
数组的第一个元素的地址与数组本身的地址相同,因此表达式Expression Type Decays to Value ---------- ---- --------- ----- a int [3][4] int (*)[4] Base address of array &a int (*)[3][4] n/a Base address of array *a int [4] int * Base address of first subarray (equivalent to a[0]) a[i] int [4] int * Base address of i'th subarray &a[i] int (*)[4] n/a Base address of i'th subarray *a[i] int n/a Value of a[i][0] a[i][j] int n/a Value of a[i][j] &a[i][j] int * n/a Address of a[i][j]
,a
,&a
,*a
,a[0]
和&a[0]
都会产生相同的值(数组的第一个元素的地址),但它们的类型不同(&a[0][0]
vs.int(*)[3][4]
vs.int(*)[4]
) 编辑 除非它是int*
或一元sizeof
运算符的操作数,否则“T的N元素数组”类型的表达式将转换(“衰减”)为“指向&
的指针”类型的表达式,表达式的值将是数组第一个元素的地址 因此表达式T
相当于*a
;这两个表达式都具有类型“int的4元素数组”。由于它们不是a[0]
如何指向同一位置?”@rohistaluja数组名称(例如大小的
和a或一元
运算符的操作数,因此这些表达式“衰减”为类型“指向&
的指针” 这就是“衰变为”一栏所显示的int
请参阅的第6.3.2.1节。当我们需要访问数组rt的不同元素时,可能会出现差异?将
与sizeof(a)
进行比较。当您将其传递给printf时,a自身会衰减为指向其第一个子数组的指针?我没有得到这一点。问题是“它们的差异是什么?”而不是“asizeof(*a)
)衰减到除少数上下文外的所有上下文中指向其第一个元素的指针。函数调用参数是一个衰减的上下文。@CoolGuy比较a
和a
的两个项目符号如何不能回答问题?对我来说,这两个项目符号说的是相同的事情,但方式不同。您已经解释了相似性,而不是dif引用。我只是想知道它的类型。所以,*a
是a
int(*)类型,
是*a
,对吗?@CoolGuy…衰减后;)a是int()类型而*a是一个int,所以a是一个指向数组的指针,就像我们有指向整数的指针一样?如果是,那么为什么我们需要使用指向数组的指针?最后一句不清楚。你能检查一下语法吗?“它本身衰减为&a[0][0]--你确定吗?这意味着int*
和a+1
是相同的。它们不是。我们如何才能在这里看到POIMTER的类型?@rohitaluja:对于数组,它在“Decays to”列中。对于指针,它在“type”列中我知道虽然它们指向同一个地址,但它们是不同的,但从上面的类型中,我只能得到一个int[4]类型,所以它就像指向数组的指针,但我无法理解其他类型的指针的行为。你能提供一个与指针和多维数组相关的源材料,以便我理解它吗well@John谢谢你的消息来源,但我还不习惯理解这些标准文件。如果你能解释一下,我会很有帮助的n更简单的语言:)@rohistaluja:这是最简单的。当数组表达式如*a+1
(3x4数组的a
)或int
(4元素数组的*a
)出现在代码中时,它们将被替换为指针表达式,其值为第一个元素的地址,除非表达式是int
或一元sizeof
运算符的操作数。&
int a[3][4];
Expression Type Decays to Value ---------- ---- --------- ----- a int [3][4] int (*)[4] Base address of array &a int (*)[3][4] n/a Base address of array *a int [4] int * Base address of first subarray (equivalent to a[0]) a[i] int [4] int * Base address of i'th subarray &a[i] int (*)[4] n/a Base address of i'th subarray *a[i] int n/a Value of a[i][0] a[i][j] int n/a Value of a[i][j] &a[i][j] int * n/a Address of a[i][j]