这是我教科书中用于说明使用指针的二维数组的程序:
int *val,r,c;//r= number of rows,c= number of columns
val=new int[r*c]
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
cin>>val[i*c+j];
}
}
这里虽然他们正在讨论2D数组,但指针仍然是1D。其次,new
在free store中分配指定大小的指针val
。
cin>>val[i*c+j];
不应该
cin>>*val[i*c+j];
因为我为给定的内存位置而不是地址取值?
答案 0 :(得分:2)
严格地说,val
不是你所说的二维数组;它确实是一维的。但是,它可以被视为一个二维数组展平成row-major order中的一维数组。
关于你的第二个问题,正确的方法是访问这个&#34; 2D&#34;数组是
val[i * c + j]
不
*val[i * j + c]
这是因为ptr[n]
定义等同于*(ptr + n)
,因此已经包含了取消引用。此外,对于行专业&#34; 2D&#34;数组每个元素的相对位置由i * c + j
而不是i * j + c
给出,因为每次增加行数时,索引都需要向前跳过c
。
答案 1 :(得分:0)
c
是每行的大小。因此行0
从val[0]
开始(0 * c),行1
从val[c]
开始(1 * c),行2
从{{1开始}}。公式是正确的。
答案 2 :(得分:0)
在c ++中,为变量名前面的*指针变量赋值。但是要使用数组,您不需要在变量名前面使用*来为数组赋值。