在C语言中,使用指针将一个数组的索引与另一个数组交换

在C语言中,使用指针将一个数组的索引与另一个数组交换,c,arrays,pointers,C,Arrays,Pointers,有人能帮我解决这个问题吗?我必须使用指针来交换数组的索引。这就是我创建的解决方案` double *swap_double_array_ptr(double *pi, int pos1, int pos2) { double *p = &pos1; double *q = &pos2; double aux=0; aux = *(pi + p); *(p + pi)

有人能帮我解决这个问题吗?我必须使用指针来交换数组的索引。这就是我创建的解决方案`

double *swap_double_array_ptr(double *pi, int pos1, int pos2) { 
         double *p = &pos1; 
         double *q = &pos2; 
         double aux=0;     
         aux = *(pi + p);    
         *(p + pi) = *(q+ pi);    
         *(q + pi) = aux; 
}

编译器说操作数无效。有人能帮我吗?我不知道还有其他解决办法。请温柔一点,我是新手。 多谢各位

void swap_double_array_ptr(double *pi, int pos1, int pos2) { 
         double aux;  
         aux = *(pi + pos1);    
         *(pos1 + pi) = *(pi+ pos2);    
         *(pos2 + pi) = aux; 
}

通过使用索引变量的地址,您做的都是错误的

您试图添加两个在c中未定义的指针

aux=*(pi+p)
pi+p
->不允许


总结并提供一些要点:-

  • 不允许添加两个指针变量

  • 允许减去两个指针变量。(偏移量计算)

由于它不返回任何内容,因此需要使函数的返回类型为void


通过使用索引变量的地址,您做的都是错误的

您试图添加两个在c中未定义的指针

aux=*(pi+p)
pi+p
->不允许


总结并提供一些要点:-

  • 不允许添加两个指针变量

  • 允许减去两个指针变量。(偏移量计算)


由于它不返回任何内容,因此您需要使函数的返回类型无效。

首先,C中不允许使用指针加法。
。C中只允许使用指针减法。您正在尝试执行无效的
pi+p

首先,C中不允许
指针加法
。C中只允许指针减法。您正在尝试执行无效的
pi+p

void swap_double_array_ptr(double *pi, int pos1, int pos2) { 
         double aux= *(pi + pos1);
         *(pos1 + pi) = *(pos2 + pi);
         *(pos2 + pi) = aux;
}
否则

void swap_double_array_ptr(double *pi, int pos1, int pos2) { 
         *(pos1 + pi) += *(pos2 + pi);
         *(pos2 + pi) = *(pos1 + pi)-*(pos2 + pi);
         *(pos1 + pi) -= *(pos2 + pi);
}
否则

void swap_double_array_ptr(double *pi, int pos1, int pos2) { 
         *(pos1 + pi) += *(pos2 + pi);
         *(pos2 + pi) = *(pos1 + pi)-*(pos2 + pi);
         *(pos1 + pi) -= *(pos2 + pi);
}

在此表达式语句中添加两个指针的操作

aux = *(pi + p); 
        ^^^^^^   
在C中没有定义

此外,函数不返回任何内容,因此其返回类型应为void

看来你的意思是

void swap_double_array_ptr( double *pi, int pos1, int pos2 ) 
{ 
         double aux = *(pi + pos1);     
         *(pi + pos1) = *(pi + pos2);    
         *(pi + pos2) = aux; 
}

考虑到对于第二个和第三个参数,使用type
size\t
比使用type
int
要好得多,因为通常类型
int
不足以存储数组的所有可能索引。

在这个表达式语句中添加两个指针的操作

aux = *(pi + p); 
        ^^^^^^   
在C中没有定义

此外,函数不返回任何内容,因此其返回类型应为void

看来你的意思是

void swap_double_array_ptr( double *pi, int pos1, int pos2 ) 
{ 
         double aux = *(pi + pos1);     
         *(pi + pos1) = *(pi + pos2);    
         *(pi + pos2) = aux; 
}

考虑到对于第二个和第三个参数,使用type
size\t
比使用type
int
要好得多,因为通常类型
int
不足以存储数组的所有可能索引。

哦,好的,谢谢。哦,好的,谢谢。我查看了
未定义行为的列表,我认为标准不允许添加
指针+浮动\u nr
。你能指出ISO9899中的哪个地方被标记为未定义的吗?我怀疑它在默认情况下会转换为整数。@alinsoar--不太清楚为什么在这里显示指针和浮点数的加法,但这将是一种违反约束的行为:@alinsoar请参阅标准6.5.6加法运算符的一节,其中写道,不完成约束一节将导致
未定义的
行为。你能在ISO9899中指出这一点吗?你从哪里读到使约束失效是未定义的行为?我检查了
未定义行为的列表,我认为标准不允许添加
指针+浮动\u nr
。你能指出ISO9899中的哪个地方被标记为未定义的吗?我怀疑它在默认情况下会转换为整数。@alinsoar--不太清楚为什么在这里显示指针和浮点数的加法,但这将是一种违反约束的行为:@alinsoar请参阅标准6.5.6加法运算符的一节,其中写道,不完成约束一节将导致
未定义的
行为。你能在ISO9899中指出这一点吗?你从哪里读到,使约束无效是未定义的行为?第二个函数定义是错误的,至少因为使用浮点数的操作是不精确的。@VladFrommosco你是对的,但考虑到浮点数上的所有运算符都是近似的,而不是精确的,在某些情况下,这可能也很有用。@VladFromMosco您可以使用任何具有反转的运算符来代替加法,当然,在某些情况下,偏差会更大。第二个函数定义是错误的,至少是因为带有浮点数的运算不精确。@VladFromMosco您是对的,但考虑到浮点数上的所有运算符都是近似值,而不是精确值,这在某些情况下可能也很有用。@VladFrommosco您可以使用任何具有逆的运算符,当然,在某些情况下偏差会更大。