Разрешено ли умножение и деление указателей в C? - PullRequest
0 голосов
/ 25 января 2020

Я помню, как мой программист сказал, что умножение и деление указателей не допускаются. У нас есть место, где нам нужно создать программу, которая добавляет, вычитает, умножает и делит два числа с помощью указателей.

Это мой код в основной функции:

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;
}

Мой код работает и работает, но разрешен ли он?

Ответы [ 2 ]

5 голосов
/ 25 января 2020

Умножение и деление указателей не допускаются в C.

Например,

int *ptr1, *ptr2, *ptr3;

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

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

Это обсуждение стоит знать причины этого ограничения на указатели в 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

См .: значение «ссылки» и «разыменования»

4 голосов
/ 25 января 2020

* x и * y относятся к указанным ими значениям, а не к указателям.

* x * * y -> разрешено.

x * y -> не разрешено.

...