所以我已阅读其他帖子,但我无法弄明白。我的代码如下,它工作正常。
double **sort(int counter, double **a){
int i, j;
double swap0, swap1;
for (i = 0 ; i < ( counter - 1 ); i++){
for (j = 0 ; j < counter - i - 1; j++){
if (a[0][j] > a[0][j+1]){
swap0 = a[0][j];
swap1 = a[1][j];
a[0][j] = a[0][j+1];
a[1][j] = a[1][j+1];
a[0][j+1] = swap0;
a[1][j+1] = swap1;
}
}
}
return a;
}
main(){
double **dist_table;
int i;
dist_table = (double **)calloc(2,sizeof(double*));
dist_table[0] = (double *)calloc(5,sizeof(double));
dist_table[1] = (double *)calloc(5,sizeof(double));
dist_table[0][0] = 5.1;
dist_table[1][0] = 0;
dist_table[0][1] = 6.1;
dist_table[1][1] = 1;
dist_table[0][2] = 3.1;
dist_table[1][2] = 2;
dist_table[0][3] = 2.1;
dist_table[1][3] = 3;
dist_table[0][4] = 7.1;
dist_table[1][4] = 4;
dist_table = sort(5, dist_table);
}
但是我读到作为一个参数传递** a是错误的。那么为什么我的代码运行良好,哪种方式正确呢?
答案 0 :(得分:1)
您的函数只是返回传递给它的相同指针。替换:
dist_table = sort(5, distortable);
使用:
sort(5, distortable);
在这种情况下,通常会更好,虽然有时返回相同的值可能很有用(例如,如果你想在更大的表达式中使用它)。
对于问题的最后一部分,如果您实际拥有double **
的二维数组,则传递double
将是错误的,如下所示:
double my_array[2][5];
但这不是你拥有的。您有一个double *
的一维(动态分配)数组,其中每个元素都指向double
的一维(动态分配)数组。实际的多维数组在内存中的表示方式与此不同,这就是为什么传递double **
不起作用的原因。但是你实际拥有的是完全不同的,传递double **
很好,这里。
其他不相关的观点......
从calloc()
转换回来是完全没必要的,通常被视为不良形式。更好的是:
dist_table = calloc(2,sizeof(double*));
dist_table[0] = calloc(5,sizeof(double));
dist_table[1] = calloc(5,sizeof(double));
或更好:
dist_table = calloc(2,sizeof *dist_table);
for ( int i = 0; i < 2; ++i ) {
dist_table[i] = calloc(5,sizeof *(dist_table[i]));
}
不要忘记检查calloc()
的返回值,以确定分配是否成功。
答案 1 :(得分:0)
只要你知道阵列的深度和元素大小,你就会以正确的方式做到这一点。
如果元素的数量是动态的并且不限于两个,则考虑null终止数组。