确定回文 - 操作员*如何工作?

时间:2011-10-21 23:27:59

标签: c pointers palindrome

该程序应该采用三位数字并将其更改为回文。 123将成为321

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

我的教授用“堆栈图”解释了一些东西,我觉得它们很有帮助。我根据另一个程序创建了这个程序,因为我注意到它与different program I made之间的相似之处,但指向如何工作?

#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;意味着地址{{}的值1}}会进入g,但我真的不熟悉它们在函数和主文件的上下文中是如何工作的。

如果某人能够阐明其工作方式(在此计划中)的基本逻辑,那将是非常棒的。作为一个数学专业,我可以理解数学和东西的操作,但指针让我没有困惑,但在我看来,有办法做到这一点,而不需要处理变量的地址等。

2 个答案:

答案 0 :(得分:5)

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

所以你必须如何编译它。你的编译错误是什么?

答案 1 :(得分:2)

好吧,既然您完全理解了&*运算符,那么其余部分非常简单。

假设你有:

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

然后,如果你说:

int *m2;
m2 = m;

m2将包含与m相同的值,也就是说,它的地址为q。因此,*m*m2将为您提供相同的值(q的值)(您了解*&的逆运算符是对吗?所以*(&q) = q&(*m) = m(在后面的情况下,m需要是*适用的指针。))

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

让我们详细检查你的函数调用:

reverse_number(in_orig, &out_orig);

我将主要内容中的in_valout_val重命名为in_origout_orig,因此不会与reverse_number的内容混合。

现在,&out_origout_orig的地址。作为参数传递时,会将其复制到out_val的{​​{1}}参数中。这就像写作:

reverse_number

现在,如果您在int *out_val = &out_orig; 中有上述行,则可以写main并更改*out_val = something;,对吧?好吧,既然您在out_orig中的地址为out_orig,那么谁在乎out_val*out_val中是否设置了main

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

指针定义

编辑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 为{em>变量的类型添加了一个&,但是*从中删除了一个* 表达式的类型。这是为什么?因为*给出了变量的地址。当然,因为没有其他地方有地址。例如&(可能)在内存中没有任何地址,如果有,它只是暂时的和没用的。

然而,

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