【发布时间】:2020-05-11 09:42:49
【问题描述】:
我记得我的编程教授说过,指针的乘法和除法是不允许的。我们有一个需要我们创建一个程序来使用指针对两个数字进行加减乘除的程序。
这是我在主函数中的代码:
float num1, num2, a, b, c, d;
printf("Enter a number: ");
scanf("%f", &num1);
printf("Enter another number: ");
scanf("%f", &num2);
a = add(&num1, &num2);
b = subtract(&num1, &num2);
c = multiply(&num1, &num2);
d = divide(&num1, &num2);
printf("Sum: %.2f\nDifference: %.2f\nProduct: %.2f\nQuotient: %.2f", a, b, c, d);
getch();
return 0;
这是我的加、减、乘、除函数代码:
float add(float *x, float *y)
{
return *x+*y;
}
float subtract(float *x, float *y)
{
return *x-*y;
}
float multiply(float *x, float *y)
{
return *x * *y;
}
float divide(float *x, float *y)
{
return *x / *y;
}
我的代码运行正常,但是否允许?
【问题讨论】:
-
是的,这是允许的,
*x不是指针,而是x指向的值。因此*x+*y;是x和y指向的两个值的加法。 -
您的代码很好,但它从不乘或除指针。它对指向的值进行乘法或除法,而指向的值不是指针,所以乘法和除法都可以。您也不能添加指针;你只能减去指针。
-
想想会发生什么。
float arr[] = {1., 2., 3., 4., 5.}, *p = arr, *p2 = arr + 2, *p3 = p / p2;(或float *p3 = p2 / p;)所以你(在 64 位计算机上)拥有的是(64-bit address - 2) / 64-bit address或(64-bit address + 2) / 64-bit address。在第一种情况下,您的数字将小于1,在第二种情况下,数字将略大于1。两个结果地址都可能位于系统保留内存空间的底部(不管您对结果地址没有有效的访问权限)。这是不允许的。 -
谢谢!我仍然混淆指针是什么以及它们实际上是如何工作的。现在我知道异常只适用于指针本身。
-
指针只是一个普通变量,它保存着其他东西的地址作为它的值。换句话说,一个指针指向可以找到其他东西的内存地址。例如,
int a = 5;将立即值5存储为其值,int *b;创建指向int的指针,b = &a;将a的地址存储为b的值(内存当前存储5的地址)。如果您需要存储在指针持有的内存地址中的值,您可以使用一元'*'运算符取消引用指针,例如int c = *b;.
标签: c function pointers function-pointers