我成功地将值输入到一个没有指针的二维数组
int main(){
int A[2][3];
for (int i=0; i<2; i++){
for(int j=0; j<3; j++){
A[i][j] = 2*i+3*j;
cout<<" "<<A[i][j]<<" ";
}
cout<<endl;
}
}
输出为
0 3 6
2 5 8
然后我尝试用指针
达到相同的结果int main(){
int A[2][3];
int (*p)[3] = A;
for (int i=0; i<2; i++){
for(int j=0; j<3; j++){
*(*A+j)= 2*i+3*j;
cout<<" "<<*(A[i]+j)<<" ";
}
cout<<endl;
}
}
输出为
0 3 6
32758 1 0
知道为什么我得到了第二个数组的不同结果吗?
赋值表达式的左操作数
*(*A+j)= 2*i+3*j;
不依赖于索引i,实际上它等价于A[0][j]
元素A[1][j]
保持未初始化状态。
而不是写
for (int i=0; i<2; i++){
for(int j=0; j<3; j++){
*( *( A + i) + j )= 2*i+3*j;
cout<<" "<<*(A[i]+j)<<" ";
}
cout<<endl;
}
或者使用声明的指针p
,程序可以如下所示
#include <iostream>
int main()
{
int A[2][3];
int (*p)[3] = A;
for ( int i=0; i < 2; i++ )
{
for ( int j=0; j<3; j++ )
{
*( *( p + i ) + j ) = 2*i+3*j;
std::cout << " " << *(A[i]+j) << " ";
}
std::cout << std::endl;
}
}
即表达式*( p + i )
与p[i]
相同,表达式*( *( p + i ) + j )
与p[i][j]
相同。
您没有正确使用指针。事实上,你根本就没有使用它。p
是指向A
中第一个int[3]
的指针。您可以使用下标操作符([]
)对其解引用,就像您对A
所做的那样。
#include <iostream>
int main() {
int A[2][3];
int(*p)[3] = A;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
p[i][j] = 2 * i + 3 * j; // proper dereferencing
std::cout << ' ' << A[i][j] << ' '; // verify via `A`
}
std::cout << 'n';
}
}