【问题标题】:Code of pointers指针代码
【发布时间】:2016-03-15 20:07:29
【问题描述】:

所以我尝试编写代码:主要获取输入三个数字,然后将这些数字的指针发送到需要在它们之间交换的函数,直到我们得到我们想要的。我们希望在代码\函数的末尾,最大的数字在 num1,第二大的数字在 num2,最小的数字在 num3。请帮我指点。该函数打印一些垃圾值。

#include <stdio.h>
#include <stdlib.h>

void whichIsBigger(int* num1, int* num2, int* num3);
void swap(int* num1, int* num2);
void printsAnswer(int* num1, int* num2, int* num3);

int main(void)
{
    int num1, num2, num3;
    int* pnum1 = &num1;
    int* pnum2 = &num2;
    int* pnum3 = &num3;
    printf("Please enter three number\n");
    scanf("%d %d %d",&num1,&num2,&num3);
    whichIsBigger(pnum1, pnum2, pnum3);
    system("PAUSE");

    return 0;
}


/*
*/
void whichIsBigger(int* num1, int* num2, int* num3)
{
    if ((*num3 > *num1) && (*num3 > *num2))
    {
        if (*num1 > *num2)
        {
            swap(&num1, &num2);
        }
    }
    else if ((*num2>*num1) && (*num2>*num3))
    {
        swap(&num2, &num3);
        if (*num1 > *num2)
        {
            swap(&num1, &num2);
        }

    }
    else if ((*num1 > *num2) && (*num1 > *num3))
    {
        swap(&num1, &num3);
        if (*num1 > *num2)
        {
            swap(&num1, &num2);
        }

    }

    printsAnswer(&num1, &num2, &num3);

}


/*
*/
void swap(int* num1, int* num2)
{
    int temp = *num1;
    *num1 = *num2;
    *num2 = temp;
}

/*
*/
void printsAnswer(int* num1, int* num2, int* num3)
{
    printf("the biggest number is: %d\n", *num1);
    printf("the second biggest number is: %d\n", *num2);
    printf("the smallest number is: %d\n", *num3);
}

【问题讨论】:

  • 尝试在打开警告的情况下编译它,你会学到一些有价值的东西:) 例如gcc -Wall your_file.c 主要问题是你传递的是指向指针而不是指针的指针。
  • 你为什么使用 swap 作为 swap(&num1,&num2) 而不是 swap(num1,num2) ?它已经是一个指针
  • 附带说明 whichIsBigger 函数似乎给出了相反的结果(将最小的数字显示为最大的数字等)

标签: c pointers


【解决方案1】:

当您将指针发送到交换函数时,您添加“&”来发送地址。因为 void swap(int* num1, int* num2);将指针作为输入,它已经知道它需要地址。因此,您正在交换指针的地址。

当你调用 swap 时不要使用地址

swap(num2, num3);

我相信这会修复你的程序。

【讨论】:

    【解决方案2】:

    函数可以如下所示

    void whichIsBigger( int *num1, int *num2, int *num3 )
    {
        if ( *num1 < *num2 ) swap( num1, num2 );
        if ( *num2 < *num3 ) swap( num2, num3 );
        if ( *num1 < *num2 ) swap( num1, num2 );
    }
    

    在 main 你可以写

    whichIsBigger( pnum1, pnum2, pnum3 );
    printsAnswer( pnum1, pnum2, pnum3 );
    

    至于你的函数,除了swap 的错误调用之外,它本质上是错误的,因为通常至少两个数字可以彼此相等。在这种情况下,if 语句中的任何条件都不等于 true。 例如,当num1 等于1 和num2 和num3 等于2 时。

    考虑到将函数printAnswer 的参数声明为指针是没有意义的。该函数可以定义为

    void printsAnswer( int num1, int num2, int num3 )
    {
        printf( "the biggest number is: %d\n", num1 );
        printf( "the second biggest number is: %d\n", num2 );
        printf( "the smallest number is: %d\n", num3 );
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-28
      • 1970-01-01
      • 2016-12-23
      • 2021-07-07
      • 2013-07-04
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多