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

gcc编译器中的C变量声明-编译时错误,c,C,假设以下C变量声明: int *A[10], B[10][10]; 在下列用语中: A[2] A[2][3] B[1] B[2][3] 如果在C程序中用作赋值语句的左侧,则不会给出编译时错误 A) 仅限1、2和4 B) 仅限2、3和4 C) 仅限2和4 D) 4只 我已经在gcc编译器上尝试过了。我将值“0”分配给上述所有变量。只有第三个显示错误。我真的不明白原因。有人能解释一下原因吗?将声明分为: int *A[10]; int B[10][10]; 您可以看到A[10]实际上是指针数组,

假设以下C变量声明:

int *A[10], B[10][10];
在下列用语中:

  • A[2]
  • A[2][3]
  • B[1]
  • B[2][3]
  • 如果在C程序中用作赋值语句的左侧,则不会给出编译时错误

    A) 仅限1、2和4

    B) 仅限2、3和4

    C) 仅限2和4

    D) 4只


    我已经在gcc编译器上尝试过了。我将值“0”分配给上述所有变量。只有第三个显示错误。我真的不明白原因。有人能解释一下原因吗?

    将声明分为:

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


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

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

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

  • 您可以将0分配给
    A[2]
    ,因为
    A
    是指针数组,您可以将0分配给指针(它是空指针)
  • 您可以将0分配给
    A[2][3]
    ,因为在这个级别上您使用的是
    int
  • 不能将0分配给
    B[1]
    ,因为
    B
    是数组的数组,而0是标量
  • 见第2条
  • 您可以将0分配给
    A[2]
    ,因为
    A
    是指针数组,您可以将0分配给指针(它是空指针)
  • 您可以将0分配给
    A[2][3]
    ,因为在这个级别上您使用的是
    int
  • 不能将0分配给
    B[1]
    ,因为
    B
    是数组的数组,而0是标量
  • 见第2条
  • [2]=0是正确的,因为[2]=NULL显然是正确的,并且NULL被定义为0。但是,如果尝试0以外的值,则会遇到某些类型转换错误
  • [2][3]=0在语法上是正确的,因为编译器将此语句理解为*(*(A+2)+3)=0;或者更清楚地,将其视为“int *p= a(2);*(p+ 3)=0”;<李>
  • B[1]不正确;表面上的原因是B[1]指向一个数组,而您不能指定一个数组;根本原因是B[1]被编译器转换为某个地址值,因此它不能作为左值工作。或者可以这样认为:B(1)没有对应的存储单元。
  • B[2][3]=0,因为它是这样工作的:)
  • [2]=0是正确的,因为[2]=NULL显然是正确的,并且NULL被定义为0。但是,如果尝试0以外的值,则会遇到某些类型转换错误
  • [2][3]=0在语法上是正确的,因为编译器将此语句理解为*(*(A+2)+3)=0;或者更清楚地,将其视为“int *p= a(2);*(p+ 3)=0”;<李>
  • B[1]不正确;表面上的原因是B[1]指向一个数组,而您不能指定一个数组;根本原因是B[1]被编译器转换为某个地址值,因此它不能作为左值工作。或者可以这样认为:B(1)没有对应的存储单元。
  • B[2][3]=0,因为它是这样工作的:)
  • 更准确地说,对于(3)您不能分配数组。即使使用C99复合文字(§6.5.2.5)表示法,也无法为数组赋值。更准确地说,对于(3),也无法为数组赋值。即使使用C99复合文字(§6.5.2.5)表示法,也无法为数组赋值。