【问题标题】:Is Multiplication and Division of Pointers allowed in C?C语言中是否允许指针的乘法和除法?
【发布时间】: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;xy 指向的两个值的加法。
  • 您的代码很好,但它从不乘或除指针。它对指向的值进行乘法或除法,而指向的值不是指针,所以乘法和除法都可以。您也不能添加指针;你只能减去指针。
  • 想想会发生什么。 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


【解决方案1】:

C中不允许指针的乘除。

例如,

int *ptr1, *ptr2, *ptr3;

ptr3 = ptr1 * ptr2; // Error: Multiplication of pointers

ptr3 = ptr1 / ptr2; // Error: Division of pointers

This 的讨论值得了解 C 中对指针的这种限制背后的原因。

进入您的代码,它之所以有效,是因为您不是乘以或除以任何指针,而是乘以和除以这些指针所指向的,因为您使用了解引用运算符。

例如,

int a = 1, b = 2, c = 3;

int *ptr1 = &a;

int *ptr2 = &b;

int *ptr3 = &c;

*ptr3 = *ptr1 * *ptr2; // No error: c = a * b

*ptr3 = *ptr1 / *ptr2; // No error: c = a / b

见:meaning of "referencing" and "dereferencing"

【讨论】:

    【解决方案2】:

    *x 和 *y 指的是它们所指向的值,而不是指针。

    *x * *y -> 允许。

    x * y -> 不允许。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多