C函数不工作

C函数不工作,c,C,我是C语言编程新手,我尝试用一个函数来交换数组的变量,但我就是不能让它工作,我不知道为什么。你能帮帮我吗?先谢谢你 代码如下: #include <stdio.h> void inplace_swap(int *x, int *y){ if (x!=y){ *y = *x ^ *y; *x = *x ^ *y; *y = *x ^ *y; } } void reverse_array(int a[], int

我是C语言编程新手,我尝试用一个函数来交换数组的变量,但我就是不能让它工作,我不知道为什么。你能帮帮我吗?先谢谢你

代码如下:

#include <stdio.h>

void inplace_swap(int *x, int *y){
    if (x!=y){
        *y = *x ^ *y; 
        *x = *x ^ *y; 
        *y = *x ^ *y; 
    }
}

void reverse_array(int a[], int cnt){
    int first, last;
    for (first = 0, last = cnt-1; first <= last; first++, last--)
        inplace_swap(&a[first], &a[last]);
}

int main(){
    //int eight = 80, seven = 70;
    //inplace_swap(&eight, &seven);
    //printf("New eight value is %d\n", eight);
    //printf("New seven value is %d\n", seven); 

    int arr[5] = {1,2,3};
    reverse_array(&arr[3], 2);
    printf("%d\n", arr[1]);
    //int i;
    //for (i=0;i < 4;i++) {
    //  printf("%d\n", arr[i]);
    //}
}
#包括
无效就地交换(int*x,int*y){
如果(x!=y){
*y=*x^*y;
*x=*x^*y;
*y=*x^*y;
}
}
无效反向_数组(int a[],int cnt){
int首先,最后;

对于代码中的(first=0,last=cnt-1;first),似乎要交换数组中最后两个0,0的元素 您的5元素数组初始化为1,2,3,0,0
当您使用“第三个”元素(实际上是数组的第四个元素)的地址调用swap函数时,您基本上交换了数组的第四个和第五个元素,并实际打印了数组的第二个元素

所有的注释和答案都需要理解,以便您了解自己犯了哪些错误。话虽如此,我重新编写了您的代码只是为了让它发挥作用。请研究差异并提出问题

#include <stdio.h>

/*** Prototypes - get in the habit of using them ***/
void inplace_swap(int *x, int *y);
void reverse_array(int *a, int cnt);
/***************************************************/

#define NUM_ELEMENTS(x)     (sizeof(x)/sizeof(x[0]))    

void inplace_swap(int *x, int *y)
{
    if (*x!=*y)
    {
        printf("Doing swap...\n");
        *y = *x ^ *y; 
        *x = *x ^ *y; 
        *y = *x ^ *y; 
    }
}

void reverse_array(int *a, int cnt)
{
    int first, last;

    for (first = 0, last = cnt-1; first <= last; first++, last--)
    {
        inplace_swap(&a[first], &a[last]);
    }
}

int main()
{
    int arr[] = {1,1,2};

    reverse_array(arr, NUM_ELEMENTS(arr));

    for ( int i = 0; i < NUM_ELEMENTS(arr); ++i )
    {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return(0);
}
#包括
/***原型-养成使用它们的习惯***/
无效就地交换(int*x,int*y);
无效反向_数组(int*a,int-cnt);
/***************************************************/
#定义NUM_元素(x)(sizeof(x)/sizeof(x[0]))
无效就地交换(int*x,int*y)
{
如果(*x!=*y)
{
printf(“进行交换…\n”);
*y=*x^*y;
*x=*x^*y;
*y=*x^*y;
}
}
无效反向数组(int*a,int cnt)
{
int首先,最后;
对于(first=0,last=cnt-1;first此代码运行良好:

#include <stdio.h>

static void inplace_swap(int *x, int *y){
   if( x != y ) {
      *y = *x ^ *y;
      *x = *x ^ *y;
      *y = *x ^ *y;
   }
}

static void print_array( int arr[], size_t count ) {
   size_t i;
   for( i = 0; i < count; ++i ) {
      printf( "%s%d", i ? ", " : "", arr[i] );
   }
   printf( "\n" );
}

static void reverse_array( int a[], int cnt ) {
   int first, last;
   for( first = 0, last = cnt-1; first <= last; first++, last-- ) {
      inplace_swap(&a[first], &a[last]);
   }
}

int main() {
   int arr[] = { 1, 2, 3, 4, 5 };
   size_t count = sizeof(arr)/sizeof(arr[0]);
   print_array  ( arr, count );
   reverse_array( arr, count );
   print_array  ( arr, count );
}

reverse\u array
函数工作正常,但在main中调用不正确:

你想要这个:

int main() {
  int arr[] = { 1,2,3 };
  reverse_array(arr, 3);

  int i;
  for (i=0;i < 3;i++) {
    printf("%d\n", arr[i]);
  }
}

如前所述,XOR交换是老式的,只适用于整数类型。

您得到了什么结果?您尝试了什么,并使用了调试器?
reverse\u array(&arr[3],2);
为什么要传递未显式初始化的元素的地址?除了上面的问题之外,您只打印
arr
printf(“%d\n”,arr[1]);
->
for(int i=0;i<3;++i)printf(“%d\n”,arr[i]”
异或交换是20世纪80年代的事。使用临时变量,那么算法也可以处理浮点类型。如果只反转索引3和4(尚未初始化)的元素,然后在索引1处显示元素,您希望它显示什么?这是一个很好的答案。假设必须使用
XOR
交换(这很可怕),而不是
if(x!=y)
条件
if(*x!=*y)
还将涵盖数据相同以及指针相同的情况。我会看一看,谢谢!你们的帮助很棒!@Diegobernaladelandatado是的,这是一些程序员使用的一个简洁的小“技巧”。这是定义函数的一种方式?35;定义NUM_元素(x)(sizeof(x)/sizeof(x[0])@DIEGOBERNALADELANTADO它叫做宏。非常感谢,错误在于调用数组。我修复了它,它工作正常!
int main() {
  int arr[] = { 1,2,3 };
  reverse_array(arr, 3);

  int i;
  for (i=0;i < 3;i++) {
    printf("%d\n", arr[i]);
  }
}
// here you declare an array of size 5 but you only initialize the first 3 elements
//This is not actually a problem in first place
int arr[5] = {1,2,3};     

// &arr[3] is the address of 4th element of the array, which has not
// been initialized, This actually swaps arr[3] with arr[4]
reverse_array(&arr[3], 2);

// here you print the second element which has not been modified
// at all by the reverse_array(&arr[3], 2);
printf("%d\n", arr[1]);