Использование тройного указателя поверх двойного указателя при считывании только значения двойного указателя?

#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. Это прямо там, в названии: «указатель». Это просто что-то, что указывает на что-то другое, а не на саму вещь.