这些陈述是什么意思?

时间:2011-04-03 14:37:49

标签: c

#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'。怎么做以及做了什么? 请非常清楚地解释一下。

4 个答案:

答案 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),您可以使用以下两个规则:

  1. 从括号内开始,在外面工作
  2. 从右边开始阅读
  3. 您还可以使用在线工具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行以后)。

希望得到这个帮助。