gcc编译器中的C变量声明 - 编译时错误

时间:2011-01-16 00:46:43

标签: c

假设以下C变量声明:

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

以下表达式:

  1. A[2]
  2. A[2][3]
  3. B[1]
  4. B[2][3]
  5. 如果在C程序中用作赋值语句的左侧,则不会产生编译时错误。

    A)仅限1,2和4

    B)仅限2,3和4

    C)仅限2和4

    D)仅限4

    我在gcc编译器上试过这个。我为所有上述变量赋值“0”。只有第三个显示错误。我无法理解原因。有人可以解释原因吗?

3 个答案:

答案 0 :(得分:6)

  1. 您可以将0分配给A[2],因为A是一个指针数组,您可以为指针指定0(它是一个NULL指针)。
  2. 您可以将0分配给A[2][3],因为在此级别您正在使用int
  3. 您不能将0分配给B[1],因为B是数组数组,0是标量。
  4. 见2.

答案 1 :(得分:0)

将声明分解为:

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

您可以看到A[10]实际上是指针的数组,而B[10][10]是整数数组的数组。您无法将整数分配给B[1]的原因是因为B[1]应该是int[]类型(数组),并且您不能使用{{1}覆盖它}值。

分配给int是有效的,因为您只是将该数组元素指向其他值,在本例中为A[2]

答案 2 :(得分:0)

  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因为这是它的工作方式:)