初学C语言的程序员如何学习指针?

idfiyjo8  于 2023-03-22  发布在  其他
关注(0)|答案(5)|浏览(119)

我是一个初学者程序员,我正在学习我的第一门语言,C。
我主要是从Deitel和Deitel的《C如何编程》一书中学习的,但也使用了大学里的示例任务和东西,但我被一个卡住了。
我对指针有一个非常基本的理解-在变量前面添加&使它打印一个地址,* 使用指针来使用存储在该地址的值等。
我写的这段代码是用来计算两个数字的最大公分母的,实际上根本不需要指针。它使用了两个函数,逻辑是正确的,因为如果我从第二个函数执行,它会将正确的答案打印到屏幕上,而不是返回到主函数。这就是问题所在。
当第二个函数返回答案值时,由于某种原因,它返回了我只能假设的指针。我不知道为什么它会这样做。我可以使用它并转换它来查找值-但是它似乎是第二个函数的本地指针,并且被写入了。我在网上或我的书中找不到任何关于如何解决这个问题的想法。
这是我的代码和输出,我知道我可以在第二个函数中打印出来,但我更想知道它是如何以及为什么没有像我希望的那样返回值。

代码

#include <stdio.h>
int greatestCD (int num1, int num2);

int main(void)
{
    int a=0, b=0;
    int result;
    printf("Please enter two numbers to calculate the greatest common denominator from\n");
    scanf("%d%d", &a, &b);
    result = greatestCD (a,b);
    printf("Using the correct in main way:\nThe greatest common denominator of %d and %d is %d\n",a,b, result);
}

int greatestCD (int num1 ,int num2)
{ 

    if (num2==0){
        printf("Using the cheaty in gcd function way:\nThe greatest common denominator is %d\n",num1);
        return num1;
    } else {
        greatestCD(num2,(num1%num2));
    }    
}

输出(使用12和15 -答案应为3)

C:\Users\Sam\Documents\C programs>gcd
Please enter two numbers to calculate the greatest common denominator from
12
15
Using the cheaty in gcd function way:
The greatest common denominator is 3
Using the correct in main way:
The greatest common denominator of 12 and 15 is 2293524

frankodwyer给出了一个非常简单的解决方案,就是一些我无法发现或者不知道的小东西,所以返回的不是指针,而是垃圾?

iszxjhcz

iszxjhcz1#

函数greatestCD()的最后一行缺少'return'语句

greatestCD(num2,(num1%num2));

来吧

return greatestCD(num2,(num1%num2));

(you可能还有进一步的调试工作要做,但这就是它返回垃圾的原因……你没有告诉它还返回什么)
edit:我还建议你在以后编译的时候打开所有的编译器警告......如果你使用的是gcc,那么试着在你的编译命令中添加一个标志 -Wall。当你做的事情可能会导致像这样的bug时,这应该会警告你。(不是每个这样的警告都一定是错误,因此是“警告”,但它通常表示可能的问题。)

pvcm50d1

pvcm50d12#

由于你正在学习C,独立于你的missing-return bug,这里有一些观察和建议:

  • 指针是语言中最难学的特性,特别是当你学习malloc()free()时。不要气馁
  • 扔掉Deitel和Deitel,给自己买一本Kernighan and Ritchie**。这是有史以来最好的语言书籍之一。
    *打开所有警告,所有时间。如果你可以使用MacOS或Linux,gcc -Wall -Werror -O是相当不错的。
    *valgrind下运行每个C程序。Valgrind是一个很棒的工具,旨在
    捕获使用指针时的错误
    。它会保存你的培根!

祝你好运!

62o28rlo

62o28rlo3#

你没有从你的函数返回任何东西,所以值2293524只是随机的垃圾。你的编译器没有给予你一个关于丢失返回值的警告吗?

5cnsuln7

5cnsuln74#

请参阅问题“我是否应该使用Herb Schildt的书来学习”,特别是在http://www.cs.technion.ac.il/users/yechiel/CS/BadBooksC+C++.html中引用的列表。尽管它列出了Deitel和Deitel的C++书籍,但给定作者对的书籍之间往往有很强的家族相似性。我倾向于给自己买一本关于C的好书。我从Kernighan &里奇那里学到的(第一版,当时只有一个版本),所以我会推荐那个-它简洁准确(就像C本身)。

dgtucam1

dgtucam15#

更奇怪的是,该程序在我的linux机器上工作。gcc的一个bug或功能?

/dev/shm $ gcc x.c
/dev/shm $ ./a.out
Please enter two numbers to calculate the greatest common denominator from
12
15
Using the cheaty in gcd function way:
The greatest common denominator is 3
Using the correct in main way:
The greatest common denominator of 12 and 15 is 3
/dev/shm $ gcc --version
gcc (Debian 4.3.2-1) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

相关问题