我从之前的考试中得到了这段代码,这是我第一次看到*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");
}
答案 0 :(得分:3)
*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
。
答案 1 :(得分:1)
通过声明
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]
。答案 2 :(得分:1)
该行
redirect_uri=http://mysite.elasticbeanstalk.com:15555/Callback&response_type=code&scope=https://www.googleapis.com/auth/youtube.force-ssl
将int *arr[] = { m[0], m[1], m[2] };
声明为指向arr
的指针数组;数组的大小由初始化器的数量决定(3)。这与编写
int
每个初始值设定项(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] };
中的每个元素都是int的指针,而不是int数组。由于C中的数组下标如何工作,arr
将为您提供与arr[i][j]
相同的结果。