我有我以前的考试中的代码,这是我第一次看到这个*arr[]
。 那是什么意思?是矩阵还是数组?它包含什么?
#include <stdio.h>
void f2(int **a, int x, int y);
int main()
{
int m[3][4] = {{7,12,11,21 }, {20,1,2,3}, {33,42,11,50}};
int *arr[] = { m[0], m[1], m[2] };
f2(arr, 3, 4);
_getch();
return 0;
}
void f2(int **a, int x, int y)
{
if (x > 0)
{
int i, j = 0, *p = a[x - 1];
for (i = 0; i < y; i++)
{
if (!(p[i] % 3))
printf("%d ", p[i]);
}
f2(a, x - 1, y);
}
else
printf("n");
}
*arr[]
是什么意思?
作为独立表达式*arr[]
无效。
对于变量定义,这里有两种含义,具体取决于此类表达式出现的上下文:
-
使用初始化器的变量定义(根据 OP 的代码片段)
int * arr[] = { m[0], m[1], m[2] };
这定义了指向
int
的指针数组,其元素数量由其初始化器中的元素数量决定。在上面的示例中,arr
将有三个元素。 -
函数参数列表中的变量定义
如果像这样使用,那就是在函数声明/定义中
void foo(int * arr[]);
它实际上定义了一个
int **
,一个指向int
的指针。在函数声明/定义的上下文中,int * arr[]
和int ** arr
是等价的,或者更一般的T*[]
等于T**
。
明确声明这一点:在任何情况下,int * arr[]
都不会定义任何int
。
行
int *arr[] = { m[0], m[1], m[2] };
将arr
声明为指向int
的指针数组;数组的大小由初始值设定项的数量(3)决定。 这和写作是一样的
int *arr[3];
arr[0] = m[0];
arr[1] = m[1];
arr[2] = m[2];
每个初始值设定项(m[0]
、m[1]
和m[2]
)都是一个 4 元素的 int
数组;然而,在大多数情况下,"T
数组"类型的表达式将被转换("衰减")为"指向T
的指针"类型的表达式,并且表达式的值将是数组第一个元素的地址。 所以上面的一行相当于
int *arr[] = { &m[0][0], &m[1][0], &m[2][0] };
arr
中的每个元素都是指向 int 的指针,而不是 int 数组。 由于 C 中的数组下标的工作方式,arr[i][j]
会给你与 m[i][j]
相同的结果。
通过语句
int *arr[]; // int* arr[] is also true but stick on to one format.
声明指向整数的指针数组。
揭秘 :
int m[3][4] = {{7,12,11,21 }, {20,1,2,3}, {33,42,11,50}};
-
m
是一个数组。 -
m[0]
、m[1]
、m[2]
指向int[4]
。第 #A 点 -
m[0][0]
是一个整数。
从 #A 点可以理解m[0]
、m[1]
、m[2]
是指针。
揭秘 :
int *arr[] = { m[0], m[1], m[2] };
-
arr[0]
、arr[1]
、arr[2]
分别分配给m[0], m[1], m[2]
。 -
m[1][2]
相当于arr[1][2]
。