【问题标题】:Why some work and some not ( Pointer and Non )为什么有些工作有些不工作(指针和非)
【发布时间】:2021-11-05 09:16:15
【问题描述】:
#include <stdio.h>

void swap1(int a, int b)
{
    int tmp;

    tmp = a;
    a = b;
    b = tmp;
    return;
}

int main()
{
    int x = 1, y = 2;

    swap1(x,y);
    printf("%d %d",x,y);
    return 0;
}

我不明白为什么没有指针这些将无法工作,但使用指针它会正常工作。我在谷歌上搜索过它,看到了一些关于它的问题,但在阅读了所有答案后我仍然不明白。

但是这段代码在不使用指针的情况下可以正常工作

#include <stdio.h>

int padovan(int n);

int main()
{
    int n;
    printf("Enter number : ");
    scanf("%d",&n);
    printf("Result : %d",padovan(n));
}

int padovan(int x)   
{
    if(x == 0 || x == 1 || x == 2)
        return 1;
    else if(x > 2)
        return padovan(x-2) + padovan(x-3);
}

【问题讨论】:

  • 参数由 value 传递。这意味着当您调用swap1 时,xy 的值将复制 到局部参数变量ab 中。对ab 的任何修改只发生在那些局部变量上,main 函数中的原始xy 变量保持不变。
  • padovan为什么起作用,是因为它使用变量x中传递的值来计算一个值,然后返回。它不会尝试修改参数本身。
  • 这是我的理解,如果我错了,请纠正我。我的理解是,它通过复制值而不是使 x = a , y = b 将 x 和 y 的值(1 和 2)传递到 a 和 b 中,因此在 swap1 中发生的任何事情都不会在 int main 中发生,而是在第二个代码可以工作,因为它没有打印 x 而是打印 padovan 本身?
  • “我在谷歌上搜索过它并看到了一些问题”不要那样做。阅读 C 编程书中有关函数的章节。您无法通过各种零散的互联网资源学习C,您需要首先通过常规学习来学习语言的基础部分。这意味着读书和/或上课。
  • @WWoPPoWW 那么他们需要被解雇。通过值或指针传递参数是非常基本的东西 - 递归函数是语言的一个奇异的危险细节,几乎没有价值。它不应该在(所有)初学者课程中教授,当然也不应该在学生熟悉如何使用普通函数之前教授。

标签: c pointers


【解决方案1】:
void swap1(int a, int b)
{
    int tmp
    tmp = a; 
    a = b;
    b = tmp;
    return; 
}

您正在按值传递ab,这意味着,当您传递ab 时,编译器会复制 a 和@987654327 @,不改变ab的实际值

如果你想让它工作,你必须使用一些指针:

void swap(int *a, int *b) {

   int tmp;
   tmp = *a;    // save the value at address x 
   *a = *b;     // put y into x 
   *b = tmp ;   // put tmp into y 
  
   return;
}
int padovan(int x)   
{
    if(x == 0 || x == 1 || x == 2)
        return 1;
    else if(x > 2)
        return padovan(x-2) + padovan(x-3);
}

这段代码很好。 padovan() 返回一个 int 并且您正在打印它。您没有修改 padovan() 中的任何参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多