不知道这是否重要,但对于这个问题,我使用兰德()来填充一个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]”时类型不兼容|
这两个定义在编译器中是不是等同的,或者发生了什么别的事情?
1条答案
按热度按时间fafcakar1#
数组不是指针,指针也不是数组。
与
arr
不是二维数组,而是指向指针数组中第一个元素的指针,而您的代码只是交换指针。但是你不能在数组之间赋值
或者从指向数组的指针;
但是,数组可以隐式转换为指向其第一个元素的指针,并且在使用数组时,“交换代码”等效于
总之,你不能交换数组,你需要逐个元素地交换。
或者使用
std::array
而不是“本机”数组,或者如果需要在运行时确定维度,则使用std::vector
。