Изменение элементов массива с помощью функции и указателя - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь изменить значения массива, используя функцию, у которой есть параметры указателя

#include <stdio.h>

void store(int *arr1, int place) {
int i;
for(i = 0; i < sizeof(*arr1); i++) {
    printf("Value %d: ", i+1);
    printf("\n");
    scanf("%d", &*arr1[place]);
    place++;
}

for(i = 0; i < sizeof(*arr1); i++) {
    printf("Element %d: %d", i, *arr1[place]);
    printf("\n");
    place++;
}



}

int main()
{
int arr[5];

store(&arr, 0);

return 0;
}

, но у меня получается:

ошибка: неверный аргумент типаунарный '*' (есть 'int')

1 Ответ

0 голосов
/ 18 марта 2019

Это должно работать правильно, позвольте мне попытаться объяснить, почему я внес эти изменения.

#include <stdio.h>
#define MAX_LENGTH 5 //preprocessor directive

void store(int arr1[]) {
int i;
for(i = 0; i < MAX_LENGTH; i++) {
    printf("Value %d: ", i+1);
    printf("\n");
    scanf("%d", &arr1[i]); 
}
for(i = 0; i < MAX_LENGTH; i++) {
    printf("Element %d: %d", i, arr1[i]); //maybe also i+1?
    printf("\n");
}
}

int main()
{
int arr[MAX_LENGTH];

store(arr); //only one parameter needed

return 0;
}

Массив сам по себе является указателем, указывающим на область памяти, массив [0] - это первый элемент, массив [1] - это область памяти первого элемента плюс размер типа данных, в данном случае - целое число. Поэтому, если вы хотите передать его функции в качестве указателя, вам не нужно указывать, что это указатель, и при этом вам не нужно указывать функции, что это указатель.

Функция sizeof () считает биты внутри массива, что означает, что вам нужно разделить его на тип данных (лучше сделать это так, чем использовать фиксированное число, потому что размер целого числа, например, может варьироваться в зависимости от машины).

int i = sizeof(arr1) / sizeof(arr1[0]) //brackets indicate single integer

Поскольку вы еще не инициализировали никаких значений, вы не получите 5 из этого, поэтому я принял решение установить значение с помощью #define вверху, это директива препроцессора, позволяющая вам установить значение, к которому вы можете получить доступ в обеих ваших функциях.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...