为什么我得到的是我从不兼容的指针类型传递参数?

时间:2012-07-19 20:24:24

标签: c pointers

  

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

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

我正在试图弄清楚在这种情况下如何将参数发送给swap。

假设N = M = 2;所以我看起来像{{“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 *的指针, 但我得到从不兼容的指针类型传递swap的参数,怎么样?

3 个答案:

答案 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]);