我编写了以下代码来指向二维数组的第一行。但是,当我做的时候
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;
}
有人可以帮我理解我哪里出错吗?
答案 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];