Объявление переменной C в компиляторе gcc - ошибка времени компиляции - PullRequest
1 голос
/ 16 января 2011

Предположим следующее объявление переменной C:

int *A[10], B[10][10];

Из следующих выражений:

  1. A[2]
  2. A[2][3]
  3. B[1]
  4. B[2][3]

Что не приведет к ошибкам времени компиляции, если используется как левая часть операторов присваивания в программе на Си.

A) 1, 2 и 4 только

B) 2, 3 и 4 только

C) Только 2 и 4

D) только 4

Я пробовал это на компиляторе gcc. Я присвоил значение «0» всем вышеперечисленным переменным. Только третий показал ошибку. Я не могу понять причину. Может кто-нибудь объяснить, пожалуйста, причину?

Ответы [ 3 ]

6 голосов
/ 16 января 2011
  1. Вы можете назначить 0 на A[2], потому что A - это массив указателей, и вы можете присвоить 0 указателю (это указатель NULL).
  2. Вы можете назначить 0на A[2][3], потому что на этом уровне вы работаете с int.
  3. . Вы не можете присвоить 0 на B[1], потому что B - это массив массивов, а 0 - скаляр.
  4. См. 2.
0 голосов
/ 16 января 2011
  1. A [2] = 0 является правильным, поскольку A [2] = NULL, очевидно, является правильным, а NULL определяется как 0. Однако если вы попытаетесь использовать какое-то значение, отличное от 0, вы должны столкнуться с ошибкой перехода типа.
  2. A [2] [3] = 0 является правильным с точки зрения синтаксиса, так как это утверждение понимается компилятором как * (* (A + 2) + 3) = 0; Или, если быть более ясным, рассмотрите это как "int * p = A [2]; * (p + 3) = 0";
  3. B [1] неверно; внешняя причина - B [1] указывает на массив, и вы не можете назначить массив; основная причина в том, что компилятор преобразует B [1] в какое-то значение адреса, поэтому он не может работать как левое значение. Или можно рассмотреть это так: нет соответствующей ячейки памяти для B [1].
  4. B [2] [3] = 0, потому что это так:)
0 голосов
/ 16 января 2011

Разбить объявление на:

int *A[10];
int B[10][10];

Вы можете видеть, что A[10] на самом деле является массивом указателей , тогда как B[10][10] является массивом целочисленных массивов. Причина, по которой вы не можете присвоить целое число B[1], заключается в том, что B[1] должен иметь тип int[] (массив), и вы не можете перезаписать его значением int.

Назначение A[2] работает, потому что вы просто указываете этот элемент массива на какое-то другое значение, в данном случае int.

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