该程序应该采用三位数字并将其更改为回文。 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
,但我真的不熟悉它们在函数和主文件的上下文中是如何工作的。
如果某人能够阐明其工作方式(在此计划中)的基本逻辑,那将是非常棒的。作为一个数学专业,我可以理解数学和东西的操作,但指针让我没有困惑,但在我看来,有办法做到这一点,而不需要处理变量的地址等。
答案 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_val
和out_val
重命名为in_orig
和out_orig
,因此不会与reverse_number
的内容混合。
现在,&out_orig
是out_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