可能重复:
Passing multidimensional arrays as function arguments in C
我正在尝试使用通用交换功能:
void swap(void **p, void **q){
void *tmp;
tmp=*p;
*p=*q;
*q=tmp;
}
int main(){
int M=5;
int N=6;
char*w[M][N];
swap(&w[1][2], &w[2][2]);
return 0;
}
我正在试图弄清楚在这种情况下如何将参数发送给swap。
假设N = M = 2;所以我看起来像{{“stack”,“overflow”},{“best”,“site”}}
答案 0 :(得分:3)
您可以将char *
转换为void *
(请将其视为特殊情况),但您无法将char **
转换为void **
并对结果执行任何有意义的操作。
出于同样的原因,您可以将int
转换为short
,但无法将int *
转换为short *
并期望编译器不要抱怨。
(它恰好适用于常见的体系结构,但C标准中没有任何内容保证两种不同的指针类型具有相同的表示形式,但有一些例外。)
void swap(char **p, char **q)
{
char *tmp;
tmp = *p;
*p = *q;
*q = tmp;
}
答案 1 :(得分:2)
您必须将void**
转换为char*
,或char*
转换为void**
,具体取决于您希望如何编写代码。
我不认为C支持任何通用的方法,使函数对它正在使用的数据类型视而不见。
编写交换函数的典型方法是针对您希望使用它的每种数据类型,因此您最终会编写单独的方法来交换int*
,char*
,而不是使用{ {1}}指针。
答案 2 :(得分:1)
您的swap
函数需要void**
作为参数,但是您传递char**
s。这就是编译器抱怨的内容。虽然所有对象指针类型都可以隐式转换为void*
,但void**
不是这样,因此您必须转换参数,
swap((void**)&w[1][2], (void**)&w[2][2]);