Переменный массив указателей или указатель на массив? - PullRequest
0 голосов
/ 18 мая 2018

Я изучаю язык C, и у меня есть некоторые трудности с пониманием указателей и массивов.

В учебнике, который я прочитал, у меня есть эта строка:

 char* arrP1[] = { "father","mother",NULL }; 

И мой вопрос - что такое arrP1?

Это массив указателей на статические строки:

enter image description here

Или это указатель на массив строк:

enter image description here

Я в замешательстве ... что такое arrP1?

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Чтобы найти ответ для таких заявлений, вы можете использовать cdecl .Скорее всего, он вам ответит.

declare arrP1 as array of pointer to char

Однако есть нечто, называемое спиральным правилом .Это также может помочь вам прочитать decleration.Например,

char *str[10]

         +-------+
         | +-+   |
         | ^ |   |
    char *str[10];
     ^   ^   |   |
     |   +---+   |
     +-----------+

-   str is an array of 10 elements
-   str is an array of 10, of pointers
-   str is an array of 10, of pointers, of type char
0 голосов
/ 18 мая 2018

Не уверен, что это поможет или сделает вещи более запутанными, но arrP1 может быть и массивом char * и char **, например так:

void foo1(char** arr) { cout << arr << endl; }
void foo2(char* arr[]) { cout << arr << endl; }

int main() {
  char *arr[] = {"a", "b"};
  cout << arr << endl;

  foo1(arr);
  foo2(arr);
  return 0;
}

Интересная вещь (которую я только что нашеля сам) в том, что foo2 не создает копию массива в своем стеке, он передает arr напрямую!Все 3 cout распечатать один и тот же адрес.

Связанные SO Q & A

0 голосов
/ 18 мая 2018

arrP - это массив char *, который в данном случае является массивом размера 3, и вы присвоили указатели на строки в стиле c с начальными значениями {"father", "mother", NULL}, которые сами по себе являются символьными массивами, которыеявляются нулевымиИтак, ваш первый ответ правильный.

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