Что означают эти заявления? - PullRequest
2 голосов
/ 03 апреля 2011
#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));
  }
}

Я не могу понять утверждения «А» и «Б». Как и что было сделано? пожалуйста, объясните это очень ясно.

Ответы [ 4 ]

5 голосов
/ 03 апреля 2011

Оператор A - это объявление

int (*p)[2];
      ^      <b>p is</b>
int (*p)[2];
     ^       p is <b>a pointer</b>
int (*p)[2];
        ^    p is a pointer <b>to an array</b>
int (*p)[2];
         ^   p is a pointer to an array <b>of 2</b>
int (*p)[2];
^^^          p is a pointer to an array of 2 <b>int</b>

Оператор B - это выражение присваивания со встроенным приведением

pint=(int*)p;
           ^  <b>take the value in p (of type "pointer to array of 2 ints")</b>
pint=(int*)p;
     ^^^^^^   take the value in p, <b>convert it to 'pointer to int'
              even if it doesn't make sense to do so</b>
pint=(int*)p;
^^^^^         take the value in p, convert it to 'pointer to int'
              <b>and put the resulting value (whatever that may be) in pint</b>

Приведение неверно.Избегайте приведений как можно больше.
(*), за исключением особых случаев, таких как <ctype.h>, или функции с переменным числом, или ...

3 голосов
/ 03 апреля 2011
int (*p)[2];

Это означает, что p является указателем на массив значений 2 int.

pint=(int*)p;

Это означает, что pint присвоено значение p.Поскольку p является указателем на массив int s, это означает, что pint теперь указывает на первый int этого массива.

Обновление:

Чтобы помочь вам прочитать объявления C или C ++ (например, утверждение A выше), вы можете использовать эти два правила:

  1. Начните с круглых скобок, выходя за пределы
  2. Читайте справа налево

Вы также можете использовать онлайн-инструмент http://www.cdecl.org, чтобы помочь вам в процессе обучения.Вставьте в него что-нибудь и посмотрите, что получится.

Второе обновление:

(int*) в контексте оператора B представляет собой cast .

2 голосов
/ 03 апреля 2011

'A' объявляет указатель на массив из 2 элементов , или другими словами, указатель на int[2].

'B' преобразует указатель массива в указатель int*.

0 голосов
/ 03 апреля 2011

A: p - указатель на массив из 2 целых чисел. B: Ну, просто линия перед B, p теперь указывает на начало s. И в точке B pint назначается так же, как и p. Так что это можно использовать позже (2 строки позже).

Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...