#arrays #c #string #pointers #double-pointer
Вопрос:
Этот код выглядит так только потому, что в назначении запрещено использование структур и глобальных переменных.
Это работает в любом случае, но мне было интересно, будет ли только использование двойного указателя перераспределять временную копию указателя.
#includelt;stdio.hgt; #includelt;string.hgt; #includelt;stdlib.hgt; void allocateData(char ***dptrArrayData, int *intArraySize) { *dptrArrayData = (char**)malloc(*intArraySize*sizeof(char*)); for (int i = 0; i lt; *intArraySize; i ) { (*dptrArrayData)[i] = (char*)malloc(12*sizeof(char)); (*dptrArrayData)[i] = "Lorem Ipsum"; } } void printDataDoublePointer(char **dptrArrayData, int intArraySize) { for (int i = 0; i lt; intArraySize; i ) { printf("Text:%s at index:%dn",dptrArrayData[i],i); } } void printDataTriplePointer(char ***dptrArrayData, int *intArraySize) { for (int i = 0; i lt; *intArraySize; i ) { printf("Text:%s at index:%dn",(*dptrArrayData)[i],i); } } int main() { char **dptrArrayData; int intArraySize = 5; allocateData(amp;dptrArrayData,amp;intArraySize); printDataDoublePointer(dptrArrayData,intArraySize); printDataTriplePointer(amp;dptrArrayData,amp;intArraySize); return 0; }
Комментарии:
1. Параметр функции должен иметь на один больше
*
, чем переменная, которую он обновляет.2. Вы можете использовать
char **
возвращаемое значение вместоchar ***
параметра.3. Вопрос не в обновлении, и, к сожалению, я не могу использовать возвращаемое значение, так как я буду возвращать много массивов в одной функции, вопрос в том, совпадает ли использование двойного указателя только для чтения с использованием тройного указателя.
4. В чем дело?
allocateData()
необходимо обновить переменнуюdptrArrayData
, поэтому она необходимаchar ***
. Другие функции ничего не обновляют, поэтому они могут использоватьchar **
.5. Поэтому, когда я передаю только двойной указатель, он не создает временную копию массива для чтения? Потому что, если я обновлю что-то в двойном указателе, значение останется в области видимости. Редактировать: Я новичок в c, ооп-это все, что я знаю…
Ответ №1:
Это работает в любом случае, но мне было интересно, будет ли только использование двойного указателя перераспределять временную копию указателя.
Я так понимаю, вы спрашиваете о разнице между
void printDataDoublePointer(char **dptrArrayData, int intArraySize)
и
void printDataTriplePointer(char ***dptrArrayData, int *intArraySize)
. В каждом случае функция получает копии всех значений аргументов, представленных вызывающим. В этом суть семантики передачи по значению, которая является единственной семантикой вызова функций, предоставляемой C.
Но речь не идет о перераспределении. Когда указатель передается в качестве аргумента функции, копируется только указатель, а не объект, на который он указывает. Функция получает независимый указатель на тот же объект, на который указывает оригинал.
Комментарии:
1. Спасибо, я этого не знал, может быть, нам стоит рассказать об этом в школе, лол
2. Это прямо там, в названии: «указатель». Это просто что-то, что указывает на что-то другое, а не на саму вещь.