1

我在使用指针时遇到了一些麻烦。

它的要点是,我试图在一个函数中定义指针并在我的 main 中调用该函数以使用这些指针。我的任务的确切说明如下:

编写两个函数,一个从键盘读取三个数字,另一个打印关于这三个数字的一​​些信息。

输入功能

编写一个具有三个整数指针参数的函数,并要求用户输入三个整数。在键盘上输入的值应该读入存储在指针参数中的地址。

注意:回想一下,scanf 需要变量的地址,而指针存储地址。

打印值

编写第二个名为 a2question2 的函数,它没有返回值,也没有参数。该函数应声明三个整数变量,然后使用您的输入函数将值读入这些变量。然后,该函数应打印总和、平均值、乘积以及这些数字中的最小和最大。

这是我到目前为止所拥有的:

int pntloc (int *x, int *y, int *z){
  int a = 0;
  int b = 0;
  int c = 0;

  printf("Please enter integer #1: ");
  scanf ("%d", & a);
  printf ("Please enter integer #2: ");
  scanf ("%d", & b);
  printf("Please enter integer #3: ");
  scanf ("%d", & c);

  *x = &a;
  *y = &b;
  *z = &c;

  return *x, *y, *z;
}

// Fourth function
main (){
  int x, y, z;
  pntloc(x, y, z);

  int sum = 0;
  int average = 0;
  int product = 0;
  int smallest = 0;
  int largest = 0;

  printf ("%d", x);
}

但是,在程序向我询问三个整数之后,它什么也没做就崩溃了。

第一个函数本身可以正常工作(通过使其成为不带参数的主函数并打印指针值来对其进行测试),即:

printf ("%d", *x);

所以我猜这些值只是没有从一个函数传递到下一个函数。我尝试了各种编写第一个和第二个函数的方法,但似乎没有任何效果。

我得到的最好的结果是让程序不会崩溃,但打印的值与我之前输入的值相差无几。

任何想法如何做到这一点?

4

3 回答 3

5

您的程序可能由于两个错误而崩溃:

1)您正在返回变量的本地地址 ab并且c

*x = &a; // This line says follow the 'x' pointer, and set the value there to
         // the address of 'a'

由于a是在本地定义的(即在函数内部),因此一旦函数返回,该地址就无效。

你的意思可能是:

*x = a; // Follow the 'x' pointer, and set the value there to the value of 'a'

2)你没有传递指针pntloc()(你的编译器应该警告你这个)

int x, y, z;
pntloc(x, y, z); // The passes the VALUES of x, y and z

你可能的意思是:

pntloc(&x, &y, &z); // Pass the ADDRESSES of x, y and z

其他一些不会导致崩溃的改进:

pntloc()您可以通过不使用局部变量来大幅缩短:

void pntloc (int *x, int *y, int *z){
  printf("Please enter integer #1: ");
  scanf ("%d", x);
  printf ("Please enter integer #2: ");
  scanf ("%d", y);
  printf("Please enter integer #3: ");
  scanf ("%d", z);
}

请注意,&已在scanf()调用中删除了。您在评论中询问过它,所以这里有更多解释:&x说“x 的地址”,但是当您有一个指针时,您已经有了一个地址。一个简单的例子:

int a;       // 'a' is an integer variable
int *b = &a; // 'b' is a pointer to the integer variable 'a'

scanf("%d",&a); // This statement reads an integer into 'a'.
                // We pass it the address of 'a', which is written &a
scanf("%d",b);  // This statement also reads an integer into 'a'.
                // We pass it the address of 'a', which is stored 
                // in the pointer 'b'.

由于我们将指针传递给函数:

void pntloc (int *x, int *y, int *z){  // Three pointers to ints

我们可以将它们直接传递给scanf(),并且不需要(也不应该)&在我们这样做时使用。

请注意,我还删除了 return 语句:

 return *x, *y, *z; 

我不认为这个 return 语句正在做你认为的那样。请记住,C 只允许一个函数返回一个值。

但你问为什么它会编译?好吧,这就是正在发生的事情 - 但如果它令人困惑,请随意忽略这一点:逗号运算符从左到右评估,同时丢弃左手结果。因此,您的 return 语句等效于:

*x;
*y;
return *z;

当左边的语句有副作用并且您想将所有内容写在一行上时,逗号运算符很有用。在我看来,它使代码更难阅读,但在一两种情况下它会使事情变得更清晰。对于初学者,我推荐以下规则:仅在函数的圆括号内使用逗号。

由于您在调用它时没有使用函数的返回值:

pntloc(&x,&y,&z);

我完全删除了返回,并将返回类型设置为void.

于 2013-06-19T01:15:46.130 回答
1
*x = &a;
*y = &b;
*z = &c;

会造成混乱和死亡!ab 和 c 是局部变量,因此您将 xy 和 z 的内容设置为从定义 ab 和 c 的函数返回后将无效的地址。也许你的意思是:

*x = a;
*y = b;
*z = c;
于 2013-06-19T01:08:57.877 回答
0

在 main() 中,

pntloc(&x, &y, &z);

*x = a;
...
printf ("%d", x);

在 pntloc() 中将 *x 作为参数传递时,调用函数后不能更改 *x 的值。

而 pntloc() 不需要返回它们,返回 0 或 1 就足够了。

于 2013-06-19T01:09:14.433 回答