0

我试图理解以下代码中的错误。该代码应该在两个数组之间切换。

我看到的是它只切换前 4 个字节。以下是正确的吗?

  1. 传递&num1ornum1是相同的(都传递数组中第一个元素的地址)。
  2. (char**)选角是错误的。那是因为当你传递和数组时,你传递了它所在的地址。所以你实际上在这里传递了一个void*.

我如何才能仅通过指针在这两个数组之间切换?那可能吗?

我知道如果从一开始我就定义了char **num1and是可能的char **num2。但我希望它保留数组符号!

#include <stdio.h>
void fastSwap (char **i, char **d)
{
    char *t = *d;
    *d = *i;
    *i = t;
}
int main ()
{
    char num1[] = "hello";
    char num2[] = "class";
    fastSwap ((char**)&num1,(char**)&num2);
    printf ("%s\n",num1);
    printf ("%s\n",num2);
    return 0;
}
4

2 回答 2

4

传递 &num1 或 num1 是相同的(都传递数组中第一个元素的地址)。我对么?

不。第一个是指向数组本身(类型char (*)[6])的指针,而在第二种情况下,您有一个指向第一个元素(类型char *)的指针;当传递给函数时,数组衰减为指向其第一个元素的指针)。

(char*) 转换是错误的

确实,您正在将 achar (*)[6]转换为 a char **

所以你实际上在这里传递了一个空白(我正确吗?)。

不,不合逻辑。我看不出这里的void类型是如何相关的。你有指针、数组,最终还有指向数组的指针。


数组不是指针。您的代码正在尝试交换数组,这是没有意义的,因为不允许分配给数组。你可能想要的是

I. 获取指向每个字符串的第一个字符的指针,然后交换指针本身,如下所示:

void swap_pointers(const char **a, const char **b)
{
    const char *tmp = *b;
    *b = *a;
    *a = tmp;
}

const char *p1 = "hello";
const char *p2 = "world";
swap_pointers(&p1, &p2);

二、或者使用实际的数组,然后交换它们的内容:

void swap_contents(char *a, char *b, size_t n)
{
    for (size_t i = 0; i < n; i++) {
        char tmp = a[i];
        a[i] = b[i];
        b[i] = tmp;
    }
}

char a1[] = "hello";
char a2[] = "world";
swap_contents(a1, a2, strlen(a1));

此外,您可能还想阅读这篇文章。

于 2013-08-08T20:09:19.653 回答
-1
1. Passing &num1 or num1 is the same (both pass the address of the first element in the array)

不正确,&num1给你一个指向整个字符串“hello”(char * [6])的指针,而num1只是一个指向字符块“hello”(char [6])的指针。

2. The (char*) casting is wrong. That's because When you pass and array you pass the address it's laid in. So you actualy pass here a void (Am i correct?).

它仍然不是 void,它只是一个指向字符指针的指针。如果它是无效的,那么做类似的事情将是完全有效的void** myVoid = &num1。这将导致语法错误,除非您在分配之前将 char** 显式类型转换为 void**。

问题是您的显式类型转换&num1为 achar**是不正确的,它是 a char*[6]。但是,当然,您不能将变量声明为 a char*[6],因此不能以这种方式使用它。要修复它,您需要将您的num1and声明num2为:

char* num1 = "hello";
char* num2 = "class";

而是保持其他一切不变。事实上,有了这个改变,就不需要将 your 类型转换&num1为 a char**,因为它已经是那样了。

于 2013-08-08T20:22:13.300 回答