C++二维数组行交换

tkclm6bt  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(257)

不知道这是否重要,但对于这个问题,我使用兰德()来填充一个2d数组的元素和IDE的CodeBlok。
我一直在学习C++,已经接触到指针和二维数组,我遇到了一些我不明白为什么它是这样工作的。
我有一个任务是使用指针交换2D数组的两行,这是我交换行的方式:

int *temp=arr[0];
 arr[0]=arr[1];
 arr[1]=temp;

当我的数组是这样定义的时候,代码编译起来就没有问题了:

int a=5;
int b=3;
int **arr=new int*[a];
    for(int i=0;i<a;i++){
        *(arr+i)=new int[b];
        for(int j=0;j<b;j++){
            *(*(arr+i)+j)=rand()%(125-15+1)+15;
            cout<<*(*(arr+i)+j)<<" ";
        }
        cout<<endl;
    }

但是当它像这样定义时,代码不会编译,我不明白有什么区别:

int a=5;
int b=3;
int arr[a][b];

我得到一条错误消息:无效数组赋值|将“int*”赋值给“int [b]”时类型不兼容|
这两个定义在编译器中是不是等同的,或者发生了什么别的事情?

fafcakar

fafcakar1#

数组不是指针,指针也不是数组。

int **arr=new int*[a];

arr不是二维数组,而是指向指针数组中第一个元素的指针,而您的代码只是交换指针。
但是你不能在数组之间赋值

int a[3] {1,2,3};
int b[3] {4,5,6};
a = b; // Error

或者从指向数组的指针;

int x = 0;
int a[3] {1,2,3};
a = &x; // Error

但是,数组可以隐式转换为指向其第一个元素的指针,并且在使用数组时,“交换代码”等效于

int *temp = &arr[0][0]; // Pointer to the first element of the array arr[0]
arr[0] = &arr[1][0]; // Try to assign a pointer to the first element of arr[1] to the array arr[0]
arr[1] = temp; // Try to assign a pointer to the array arr[1]

总之,你不能交换数组,你需要逐个元素地交换。
或者使用std::array而不是“本机”数组,或者如果需要在运行时确定维度,则使用std::vector

相关问题