Возможно ли преобразовать все эти указатели в массив указателей? - PullRequest
0 голосов
/ 01 мая 2020

У меня есть такие указатели. Я не знаю, правильно ли я это сделал. Я не знаю, как выделить память для них. Может быть, компьютер распределяет память автоматически?

    char *d = "Array1";
    char *d1 = "Array2";
    char *e = "Sum array";

Можно ли создать массив указателей, подобных этому:

char *names[] = {"Array1","Array2","Sum array"}

И как использовать эти указатели, когда я вызываю функцию?

Я обычно использую (второй аргумент - мой указатель):

writeArray(wc, e, n, arr2);

Так что, когда я использую массив указателей, это будет что-то подобное?

writeArray(wc, name[2], n, arr2);

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

У меня есть такие указатели. Я не знаю, правильно ли я это сделал. Я не знаю, как выделить память для них. Может быть, компьютер распределяет память автоматически?

char *d = "Array1";
char *d1 = "Array2";
char *e = "Sum array";

Компилятор выделит массив char со сроком хранения stati c для каждого строкового литерала и инициализирует переменные так, чтобы они указывали на первый символ из этих char массивов.

Можно ли создать массив указателей, например:

char *names[] = {"Array1","Array2","Sum array"}

Да (хотя для объявления требуется точка с запятой), компилятор автоматически установит длину массива names на 3, чтобы соответствовать количеству инициализаторов, поскольку длина не была указана явно.

Как и прежде, компилятор выделит массив char с stati c продолжительность хранения каждого строкового литерала. Компилятор инициализирует каждый элемент массива names так, чтобы он указывал на первый символ этих массивов char.

Поскольку содержимое этих строковых литералов совпадает с содержимым, используемым для инициализации d, d1 и e переменная, компилятор может перекрывать хранилище для идентичных строковых литералов. Это нормально, потому что код C не должен изменять хранилище, занимаемое этими строковыми литералами.

Если names[] имеет automati c длительность хранения (в функции), вы можете объявите и инициализируйте его следующим образом, предполагая, что d, d1 и e уже указывают на правильные строковые литералы:

char *names[] = {d, d1, e};

Тогда элементы names[] будут указывать на точно такой же строковый литерал char массив хранения как d, d1 и e.

А как использовать эти указатели при вызове функции?

I обычно используют (второй аргумент - мой указатель):

writeArray(wc, e, n, arr2);

Так что, когда я использую массив указателей, это будет что-то подобное?

writeArray(wc, name[2], n, arr2);

Да, точно вот так.

2 голосов
/ 01 мая 2020

Можно ли создать массив указателей, подобных этому

Да, это так.

Итак когда я использую массив указателей, это будет что-то подобное?

Правильно.

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