C指针到指针警告

C指针到指针警告,c,pointers,warnings,C,Pointers,Warnings,当我指向指针时,会收到警告。我不知道为什么;类型相同 char delay_buffer1[40]; char delay_buffer2[40]; char** delay_buffer_front; delay_buffer_front = &delay_buffer1; 目标是交换缓冲区: void swap_string_buffer(void** pointer, void* buffer1, void* buffer2) { printf("pointer: %u. b

当我指向指针时,会收到警告。我不知道为什么;类型相同

char delay_buffer1[40];
char delay_buffer2[40];
char** delay_buffer_front;
delay_buffer_front = &delay_buffer1;
目标是交换缓冲区:

void swap_string_buffer(void** pointer, void* buffer1, void* buffer2) {
  printf("pointer: %u. buffer1: %u. buffer2 %u\n", pointer, buffer1, buffer2);
  if(*pointer == buffer1) *pointer = buffer2;
  else *pointer = buffer1;
}
示例代码:

copy_content_to(delay_buffer_front);
swap_string_buffer((void**) delay_buffer_front, (void*) delay_buffer1,(void*)delay_buffer2);
fprintf(file, "%s", delay_buffer_front);
警告:来自不兼容指针类型[-Wincompatible指针类型]的分配 延迟缓冲区前端=&延迟缓冲区1


这恰恰意味着,这两个指针是不兼容的。与其说是警告,不如说是错误

你可能想要这个:

char* delay_buffer_front;
delay_buffer_front = delay_buffer1;
而不是:

char** delay_buffer_front;
delay_buffer_front = &delay_buffer1;

这恰恰意味着,这两个指针是不兼容的。与其说是警告,不如说是错误

你可能想要这个:

char* delay_buffer_front;
delay_buffer_front = delay_buffer1;
而不是:

char** delay_buffer_front;
delay_buffer_front = &delay_buffer1;
类型相同

char delay_buffer1[40];
char delay_buffer2[40];
char** delay_buffer_front;
delay_buffer_front = &delay_buffer1;
不,他们不是。您可能会对以下事实感到困惑(这是很常见的),即数组的标识符在几乎所有上下文中都计算为指向其第一个元素的指针(例外情况是运算符
&
的大小)

但这并没有改变一个事实,即数组就是数组,指针就是指针

这是指向指针的指针:

char *delay_buffer_front = delay_buffer1;
您可能想要的是指向数组的指针:

或者您可能只是想要一个指向数组第一个元素的普通指针:

char *delay_buffer_front;
使用该声明,您可以只分配数组的标识符,因为如上所述,它的计算结果是这样一个指针:

char *delay_buffer_front = delay_buffer1;
类型相同

char delay_buffer1[40];
char delay_buffer2[40];
char** delay_buffer_front;
delay_buffer_front = &delay_buffer1;
不,他们不是。您可能会对以下事实感到困惑(这是很常见的),即数组的标识符在几乎所有上下文中都计算为指向其第一个元素的指针(例外情况是运算符
&
的大小)

但这并没有改变一个事实,即数组就是数组,指针就是指针

这是指向指针的指针:

char *delay_buffer_front = delay_buffer1;
您可能想要的是指向数组的指针:

或者您可能只是想要一个指向数组第一个元素的普通指针:

char *delay_buffer_front;
使用该声明,您可以只分配数组的标识符,因为如上所述,它的计算结果是这样一个指针:

char *delay_buffer_front = delay_buffer1;

因为您只想交换缓冲区,所以不必创建指向指针的指针。只需创建一个类似类型的中间指针并将其用于交换

char* delay_buffer_front; //Intermediate pointer to store the address of first buffer
delay_buffer_front = delay_buffer1; //Store the address of the first buffer in the 
                                    //intermediate pointer.

因为您只想交换缓冲区,所以不必创建指向指针的指针。只需创建一个类似类型的中间指针并将其用于交换

char* delay_buffer_front; //Intermediate pointer to store the address of first buffer
delay_buffer_front = delay_buffer1; //Store the address of the first buffer in the 
                                    //intermediate pointer.

“类型是一样的。”不完全正确。指向指针的指针与指向数组的指针的类型不同。delay\u buffer1==&delay\u buffer1=&delay\u buffer1[0]如何调用
swap\u string\u buffer
?请显示一个小的。。。。那么,
delay\u buffer\u front
的目的是什么?请解释
swap\u string\u buffer
应该做什么。显示具有预期输出的。。。。但是它应该做什么呢???请给出一个完整的示例,说明在调用
交换字符串缓冲区
“类型相同”之前和之后,所有缓冲区的内容应该是什么。不完全正确。指向指针的指针与指向数组的指针的类型不同。delay\u buffer1==&delay\u buffer1=&delay\u buffer1[0]如何调用
swap\u string\u buffer
?请显示一个小的。。。。那么,
delay\u buffer\u front
的目的是什么?请解释
swap\u string\u buffer
应该做什么。显示具有预期输出的。。。。但是它应该做什么呢???请给出一个完整的示例,说明在调用
swap\u string\u buffer
Upvote之前和之后,所有缓冲区的内容应该是什么,以确定指针和数组之间的差异。不过,这种
char(*buf)[40]
语法看起来很伤人。这看起来和我在第一次认真的C设计中犯的错误一模一样,我是C新手,大约在1984年左右将应用程序从Pascal转换为C。“指向数组的指针”是Pascal中使用的一种自然数据类型,但在C.Upvote中,指针和数组之间的差异通常是一种符号负担。不过,这种
char(*buf)[40]
语法看起来很伤人。这看起来和我在第一次认真的C设计中犯的错误一模一样,我是C新手,大约在1984年左右将应用程序从Pascal转换为C。“指向数组的指针”是Pascal中使用的一种自然数据类型,但在C中通常是一种符号负担。