#c #arrays #function #pointers
#c #массивы #функция #указатели
Вопрос:
Я пытаюсь изучить массивы и указатели в C. Я пытаюсь написать программу, которая в функции: получает 2 числа от пользователя, помещает их в массив и возвращает их в основную функцию. Я получаю ошибку и не понимаю, в чем проблема. Вот мой код:
#include<stdio.h>
void get_nums(float *x)
{
float num1, num2;
printf("enter two numbers: ");
scanf("%f %f", amp;num1, amp;num2);
*x[0] = num1;
*x[1] = num2;
}
main(){
float x[2];
float (*p_x)[2] = amp;x;
get_nums(p_x[2]);
printf("Number 1: %fnNumber 2: %f", x[0], x[1]);
return 0;
}
Я получаю ошибку в этих 2 строках
*x[0] = num1;
*x[1] = num2;
Сообщение об ошибке является
Ошибка: операндом ‘*’ должен быть указатель
Я не понимаю, что здесь не так. Кто-нибудь видит проблему?
РЕДАКТИРОВАТЬ: я изменил 2 строки на
x[0] = num1;
x[1] = num2;
и теперь я могу запустить программу. Однако я получаю новую ошибку после ввода двух чисел. Сообщение об ошибке является:
Unhandled exception at 0x40e00000 in arraysandpointers.exe: 0xC0000005: Access violation.
Ответ №1:
Вам не нужно *
. Просто это нормально:
x[0] = num1;
x[1] = num2;
В вашем исходном коде x[0]
уже есть тип float
. *x[0]
попытаюсь выполнить ее уважение, что невозможно, поскольку x[0]
это не указатель. Поэтому она не компилируется.
РЕДАКТИРОВАТЬ: Также измените свой main на this:
int main(){
float x[2];
get_nums(x);
printf("Number 1: %fnNumber 2: %f", x[0], x[1]);
return 0;
}
Необязательно иметь p_x
. И это то, что вызывает сбой.
Комментарии:
1. Это сработало, однако теперь я получаю новую ошибку. После того, как я ввожу два числа, я получаю ошибку: «Необработанное исключение в 0x40e00000 в arrayandpointers.exe : 0xC0000005: нарушение доступа.»
Ответ №2:
*X
может рассматриваться как X
подобный X[]
массив. Поэтому, когда вы пишете as *X[0]
, это рассматривается как 2D-массив. Поэтому удалите указатели в X[0]
и X[1]
.
Удалите эти две строки:
float (*p_x)[2] = amp;x;
get_nums(p_x[2]);
Вы можете напрямую сделать get_nums(x)
.