У меня есть такие указатели. Я не знаю, правильно ли я это сделал. Я не знаю, как выделить память для них. Может быть, компьютер распределяет память автоматически?
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);
Да, точно вот так.