#include<stdio.h>
int main( )
{
int s[5][2] = { { 1234, 56 }, { 1212, 33 }, { 1434, 80 }, { 1312, 78 } } ;
int ( *p )[2];
int i, j, *pint ;
for ( i = 0 ; i <= 3 ; i++ )
{
p = &s[i] ;
pint = (int *)p ;
printf ( "\n" ) ;
for ( j = 0 ; j <= 1 ; j++ )
printf ( "%d ", *( pint + j ) ) ;
}
return 0;
}
这是输出:
1234 56
1212 33
1434 80
1312 78
为什么在int(*p)[2]
中使用2。我们不能使用3,4或任何其他数字吗?
p(int *)p是什么意思?
那么p=&s[i];
在代码中的意义是什么?
答案 0 :(得分:1)
因为它是指向两个int
的数组的指针,并且被分配了s
的元素,这些元素也是两个int
的数组(必须匹配来自的最后一个维度)那个数组)。
这里实际上没有必要,因为它只是临时变量,会立即分配给pint
,因此可以直接从s[i]
分配到pint
。
此外,您询问的表达方式错误:
pint = (int *)p ;
应该是:
pint = *p ;
这在语义上是正确的。第一个只是因为指针指向数组开始的同一个内存,但它很容易出错,因为编译器没有检查。
答案 1 :(得分:0)
在您的代码s
中是一个5×2数组。在C中,2-D数组是一个数组数组,因此s
实现为包含两个元素的五个数组的数组。
如果指针的类型与数组元素的类型匹配,则可以使用指针访问数组元素。因此,要访问5×2数组,您需要一个指向两个数组的指针。在C中声明这种指针的语法如下:
int(*p)[2]
我们不能使用3,4或任何其他数字吗?
没有。该数字必须与s
元素数组的大小相匹配才能使分配正常工作。
代码中
p=&s[i];
的重要性是什么?
其含义与任何其他类型的数组相同:&s[i]
生成指向数组i
的元素s
的指针。等效表达式为p = s+i;