Передача массива указателей в функцию в C - PullRequest
0 голосов
/ 13 ноября 2018

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

#include <stdio.h>
#include <stdlib.h>
int transformare(int *v[1])
{
    *v[1] = 10;
    return 0;
}
int main()
{
    int v[1];
    printf("n = ");
    scanf("%d", &v[1]);
    transformare(&v);
    printf("%d", v[1]);
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

У вас две проблемы:

  1. Индексы массива начинаются с нуля.То есть массив из N элементов имеет индексы от 0 до N - 1 (включительно)

  2. Объявление int *v[1] объявляет v как массив одного указателя на int, а не указатель на массив из одного int.Это было бы int (*v)[1].Это также тип &v из функции main.

Решение второй проблемы (с использованием правильного типа) приводит к третьей проблеме, так как это означаетчто *v[0] неверно из-за приоритета оператора .Здесь также необходимо использовать скобки, как в (*v)[0].


Однако вторая (и следующая третья) проблема спорная, поскольку выне нужно передавать массивы «по ссылке».

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

Это означает, что вы можете объявить функцию, просто приняв int * в качестве аргумента,и просто передайте простой v в качестве аргумента.

0 голосов
/ 13 ноября 2018

Во-первых, обратите внимание, что индексы основаны на 0 в C, то есть первый (и - только в вашем случае) элемент - v[0].

Что касается его передачи, просто определите параметр как указатель на int, т.е. int*. Переменная типа int[1] преобразуется в указатель на int при передаче в функцию (поэтому нет необходимости писать transformare(&v), ее transformare(v).

int transformare(int *v)
{
    v[0] = 10;
    return 0;
}

int main()
{
    int v[1];
    printf("n = ");
    scanf("%d", &v[0]);
    transformare(v);
    printf("%d", v[0]);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...