指向特定的2-D阵列行

时间:2017-01-04 10:10:00

标签: c++ c++11 variable-assignment addressof

我编写了以下代码来指向二维数组的第一行。但是,当我做的时候

arrayPtr = & array[0];

我最终得到了

  

错误:无法在作业中将double (*)[1]转换为double*

 arrayPtr = & array[0];

我的节目是:

#include <iostream>

int main(int argc, char **argv) 
{       
    double array[2][1];

    array[0][1] = 1.0;
    array[1][1] = 2.0;

    double* arrayPtr;
    arrayPtr = &array[0];

    return 0;
}

有人可以帮我理解我哪里出错吗?

3 个答案:

答案 0 :(得分:2)

而不是arrayPtr = & array[0],您可以写

 arrayPtr = array[0];

使用数组衰减属性。

相关,

  • 引用C11,章节§6.3.2.1,左值,数组和函数指示符

      

    除非它是sizeof运算符,_Alignof运算符或者&运算符的操作数。   一元C++14运算符,或者是用于初始化数组的字符串文字,一个包含的表达式   type ''类型''的数组被转换为类型''指向类型''指针的表达式   到数组对象的初始元素,而不是左值。 [...]

  • 引用(4.1),章节§5.3.3

      

    左值到右值(4.2),数组到指针(4.3)和函数到指针sizeof标准转换不是   应用于array[0]的操作数。

    ,对于章节 4.2

      

    “数组N T”“未知范围的T”数组的左值或右值可以转换为prvalue   类型“指向T的指针”。结果是指向数组的第一个元素的指针。

因此,当用作赋值运算符的RHS操作数时,double*衰减到指向数组第一个元素的指针,即产生类型&,它与LHS相同

否则,array[0]运算符的使用会阻止double [1]的数组衰减,&array[0]double [1]类型的数组。

因此,double (*) [1]返回一个类型,该类型是指向double *int a = 1; int b = 4; for (int i = 1; i <= 4; i++) { for (int k = a; k >= 1; k--) { String result = String.valueOf(k); text.append(result); } for (int c = 1; c <= b - 1; c++) { text.append(" "); } a = a + 2; b--; text.append("\n"); } System.out.println(text.reverse()); 数组的指针,该数组与兼容的类型为在作业的LHS中提供的变量,{}

答案 1 :(得分:2)

在您的代码中:

  • array的类型为double (*)[1];
  • array[0]的类型为double[1]
  • &array[0](此等于array)的类型为double (*)[1](即指向double[1]的指针)

注意1: T[]可以衰减到T*。因此,在您的示例中double[]可以衰减为double *

注2: a[b] == *(a + b),因此在您的示例中&array[0]等于& (*(array + 0)),简化为array本身。

答案 2 :(得分:1)

(gdb) start
Temporary breakpoint 1 at 0x103ec
Starting program: /home/pi/asm/kk

Temporary breakpoint 1, 0x000103ec in main ()
(gdb) disassemble
Dump of assembler code for function main:
   0x000103e8 <+0>:     push    {lr}            ; (str lr, [sp, #-4]!)
=> 0x000103ec <+4>:     ldr     r0, [pc, #8]    ; 0x103fc <address_of_value>
   0x000103f0 <+8>:     ldr     r0, [r0]
   0x000103f4 <+12>:    pop     {lr}            ; (ldr lr, [sp], #4)
   0x000103f8 <+16>:    bx      lr
End of assembler dump.
(gdb) info registers r0
r0             0x1      1
(gdb) stepi
0x000103f0 in main ()
(gdb) stepi
0x000103f4 in main ()
(gdb) disassemble
Dump of assembler code for function main:
   0x000103e8 <+0>:     push    {lr}            ; (str lr, [sp, #-4]!)
   0x000103ec <+4>:     ldr     r0, [pc, #8]    ; 0x103fc <address_of_value>
   0x000103f0 <+8>:     ldr     r0, [r0]
=> 0x000103f4 <+12>:    pop     {lr}            ; (ldr lr, [sp], #4)
   0x000103f8 <+16>:    bx      lr
End of assembler dump.
(gdb) info registers r0
r0             0x6c617669       1818326633

double array[2][1]; double* arrayPtr; arrayPtr = & array[0]; 的类型为

arrayPtr

POINTER (DOUBLE) 的类型为

array

POINTER(POINTER(DOUBLE)) 的类型为

&array[0]

您尝试分配

POINTER(POINTER(DOUBLE))

正确的方法是

POINTER (DOUBLE) <= POINTER(POINTER(DOUBLE))

arrayPtr = array[0];