#include<stdio.h>
void main() {
int s[4][2]={
{1,2},
{3,4},
{5,6},
{7,8}
};
int (*p)[2]; // what does this statement mean? (A)
int i,j,*pint;
for(i=0;i<=3;i++) {
p=&s[i];
pint=(int*)p; // what does this statement mean? (B)
printf("\n");
for(j=0;j<=1;j++) {
printf("%d",*(pint+j));
}
}
我无法理解陈述'A'和'B'。怎么做以及做了什么? 请非常清楚地解释一下。
答案 0 :(得分:5)
陈述A是声明
int (*p)[2]; ^ p is int (*p)[2]; ^ p is a pointer int (*p)[2]; ^ p is a pointer to an array int (*p)[2]; ^ p is a pointer to an array of 2 int (*p)[2]; ^^^ p is a pointer to an array of 2 int
语句B是带有嵌入式强制转换的赋值表达式
pint=(int*)p; ^ take the value in p (of type "pointer to array of 2 ints") pint=(int*)p; ^^^^^^ take the value in p, convert it to 'pointer to int' even if it doesn't make sense to do so pint=(int*)p; ^^^^^ take the value in p, convert it to 'pointer to int' and put the resulting value (whatever that may be) in pint
演员阵容很糟糕。尽可能避免演员阵容
(*)除非在<ctype.h>
或变量函数或......等非常特殊的情况下...
答案 1 :(得分:3)
int (*p)[2];
这意味着p
是指向2个int
值数组的指针。
pint=(int*)p;
这意味着pint
的值为p
。由于p
是指向int
数组的指针,这意味着pint
现在指向该数组的第一个int
。
<强>更新强>
为了帮助您阅读C或C ++声明(如上面的语句A),您可以使用以下两个规则:
您还可以使用在线工具http://www.cdecl.org在学习过程中为您提供帮助。将东西粘贴到其中,看看会发生什么。
第二次更新:
语句B的上下文中的 (int*)
是cast。
答案 2 :(得分:2)
'A'声明一个指向2个元素数组的指针,换句话说,指向int[2]
的指针。
'B'将数组指针转换为指针int*
。
答案 3 :(得分:0)
答:p
是指向2个整数数组的指针。
B:嗯,就在B之前的一行,p
现在指向s
的开头。
并且,在B处,pint
被指定为指向与p
相同的位置。所以它可以在以后使用(2行以后)。
希望得到这个帮助。