2

可能重复:
在 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;
    }

让我们假设 w 已经用值初始化,我只想知道我应该发送参数的方式

我试图弄清楚在这种情况下我应该如何将参数发送到交换。

假设 N=M=2;所以我有 w 看起来像 {{"stack", "overflow"},{"best", "site"}}

  1. swap(w[i][j],w[k][r])不是正确的选项,因为 w[i][j] 是对实际字符串的引用,而 swap 得到 **void,其中只有 w[i] [j] 是一个只指向 *char 的指针,所以
  2. swap(&w[i][j], &w[k][r])看起来是正确的选择。因为它是一个指向 char* 的指针,但是我从不兼容的指针类型中得到了交换的参数,怎么会?
4

3 回答 3

3

您可以转换char *void *(将其视为特殊情况),但您不能转换char **void **并对结果执行任何有意义的操作。

出于同样的原因,您可以转换intshort,但您不能转换int *short *并期望编译器不会抱怨。

(它恰好适用于常见的体系结构,但 C 标准中没有任何内容可以保证两种不同的指针类型具有相同的表示形式,但有几个例外。)

void swap(char **p, char **q)
{
    char *tmp;
    tmp = *p;
    *p = *q;
    *q = tmp;
}
于 2012-07-19T20:32:11.740 回答
2

您必须转换void**char*, 或char*tovoid**取决于您希望如何编写代码。

我不认为 C 支持任何通用的方式让函数对它正在使用的数据类型视而不见。

编写交换函数的典型方法是针对您希望使用它的每种数据类型,因此您最终将编写单独的方法来交换int*char*等等,而不是使用void指针。

于 2012-07-19T20:29:03.717 回答
1

您的swap函数需要void**作为参数,但您传递了char**s. 这就是编译器所抱怨的。虽然所有对象指针类型都可以隐式转换为void*,但对于 来说并非如此void**,因此您必须强制转换参数,

swap((void**)&w[1][2], (void**)&w[2][2]);
于 2012-07-19T20:28:14.910 回答