0

该程序应该接收一个三位数并将其更改为回文。123会变成321.

逻辑正确,程序编译正确。:) 然而,这些逻辑并不容易。

我的教授用“堆栈图”解释了一些事情,我发现它们很有帮助。我基于另一个程序创建了这个程序,因为我注意到这个程序和我制作的另一个程序之间的相似之处,但是指向是如何工作的?

#include <stdio.h>

void reverse_number(int in_val, int *out_val) {
    int ones, tens, hundreds;

    ones = in_val % 10;
    tens = (in_val % 100 - ones) / 10;
    hundreds = (in_val - (ones + tens)) / 100;

    *out_val = (ones * 100) + (tens * 10) + hundreds;
}

int main() {
    int in_val;
    int out_val;

    printf("Give a three digit num to reverse: \n");
    scanf("%d", &in_val);

    reverse_number(in_val, &out_val);
    printf("New number is: %d \n", out_val);

    return 0;
}

另外,我现在开始了解如何使用这些指针基于一种模板编写程序,并且我非常基本地了解参数内的星号的含义(声明为指针变量)。

例如,我知道m = &q;为变量提供m了另一个变量的地址,q我知道这m = *g;意味着地址处的值g会进入m,但我真的不熟悉这些在函数和主文件的上下文中是如何工作的。

如果有人可以列出它如何工作的基本逻辑(在这个程序中),那就太棒了。作为一名数学专业的学生,​​我可以理解数学和东西的操作,但指针让我没有感到困惑,但在我看来,有一些方法可以做到这一点,而无需处理变量的地址等。

4

2 回答 2

5

当我运行它时,它会编译,甚至可以工作。见:http: //ideone.com/RHWwI

所以这一定是你编译它的方式。你的编译器错误是什么?

于 2011-10-21T23:31:07.957 回答
2

好了,既然你已经完全理解&*操作了,剩下的就很简单了。

假设您有:

int q;
int *m;
m = &q;

那么如果你说:

int *m2;
m2 = m;

m2将包含与 相同的值m,也就是说,它将具有 的地址q。因此,*mand*m2会给你相同的值(也就是 的值q)(你明白*是对的逆运算符&吗?所以*(&q) = qand &(*m) = m(在后面的情况下,m需要是一个指针*才能适用。))

那么,这如何与函数一起使用?简单的!当您将参数传递给函数时,您按值传递它们。当你通过指针传递时,你实际上是通过值传递,即变量的指针。

因此,让我们详细检查您的函数调用:

reverse_number(in_orig, &out_orig);

我将您的in_valand重命名out_valin_origout_orig因此它不会与reverse_number.

现在,&out_orig是 的地址out_orig。当作为参数传递时,它被复制out_valreverse_number. 这和写作完全一样:

int *out_val = &out_orig;

现在,如果您的 中包含上述行main,您可以编写*out_val = something;它并且它会改变out_orig,对吗?好吧,既然你有out_origin的地址out_val,那么谁在乎是否*out_val设置在mainor reverse_number

所以你看?当你有一个指针时,你可以复制它,无论是将它复制到另一个变量还是将它作为函数的参数传递(这基本上是同一件事),你仍然可以访问它指向的同一个变量。毕竟,所有副本都具有相同的值:地址out_orig。现在,如果您想在 function 或 in 中访问它main,这并不重要。

编辑*在指针定义中

**也可以用于定义指针,这与之前用作获取地址值的运算符无关。

这只是定义,所以你必须学习它:

如果您有一个类型的值type(例如int),那么该变量的地址(使用operator &)具有类型type *(在本例中int *)。由于指针采用该地址,因此指针的类型为type *

相反,如果指针具有类型type *(例如int *),则获取指针指向的值(使用operator *)具有类型type(在本例中int)。

总之,你可以这样说:

operator &, adds one * to the type of the variable
operator *, removes one * from the type of the expression

所以让我们看一些例子:

int x;
x has type int
&x has type int *

float *y;
y has type float *
&y has type float **
*y has type float

struct Data ***d;
d has type struct Data ***
&d has type struct Data ****
*d has type struct Data **
*(*d) has type struct Data *
*(*(*d)) has type struct Data

如果你注意到了,我说过&*variable 的类型加一个,但从expression的类型中*删除一个。这是为什么?因为给出了变量的地址。当然,因为没有其他东西有地址。例如(可能)在内存中没有任何地址,如果有,它只是暂时的和无用的。*&a+b

operator *但是,适用于地址。无论您如何计算地址,都operator *可以使用它。例子:

*(0x12345678) -> Note that even if the compiler let's you do this,
                 your program will most likely crash

*d -> like we saw before

*(d+4) -> This is the same as writing d[4]
          And now you know why arrays and pointers are treated as one

如果是动态二维数组:

*(*(d+4)+6) -> This is the same as writing d[4][6]
于 2011-10-21T23:56:58.993 回答