ELI5: Что такое тип данных `int * p []` - PullRequest
0 голосов
/ 05 декабря 2018

Я не понимаю, что это за тип данных.Если это указатель или массив.Пожалуйста, объясните в простых терминах.Чтобы процитировать то, что было в книге -

Если вы хотите передать массив указателей в функцию, вы можете использовать тот же метод, который вы используете для передачи других массивов - просто вызовите функцию с помощьюимя массива без каких-либо индексов.Например, функция, которая может получить массив x, выглядит следующим образом:

void display_array(int *q[])
{
  int t;
  for(t=0; t<10; t++)
    printf("%d ", *q[t]);
}

Помните, q не указатель на целые числа, а скорее указатель на массив указателей на целые числа,Поэтому вам нужно объявить параметр q как массив целочисленных указателей, как только что показано.Вы не можете объявить q просто как целочисленный указатель, потому что это не то, чем оно является.

цитировать: C ++: Полный справочник, 4-е издание Герберта Шильдта, стр. 122-123

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

Я не понимаю, что это за тип данных

Если это утешит, ни автор книги, которую вы читаете.

Помните, q не указатель на целые числа, а скорее указатель на массив указателей на целые числа.

Это bullschildt .

  • До настройки параметров, q - массив указателей на целые числа.
  • После настройки параметров, q - указатель на первый элемент массива указателей на целые числа.Эквивалентен int** q, указателю на указатель на int.

Нигде это не «указатель на массив указателей на целые числа».Это было бы int* (*q)[].

Я бы посоветовал прекратить чтение этой книги.

Ключ в том, что любой массив, который является частью списка параметров функции, корректируется («распадается») в указатель на первый элемент.Так что не имеет значения, если вы введете int* q[666] или int* q[], либо будет тихо заменен компилятором с int** «за чертой».

Это фактически причина, по которой мы можем написать[] в списке параметров - обычно пустой массив представляет собой неполный тип, который нельзя использовать до завершения в другом месте.Но поскольку параметры всегда корректируются, они никогда не относятся к типу массива, и не имеет значения, что исходный тип был неполным.

0 голосов
/ 05 декабря 2018

Вот как это построено:

  • int - это тип"int".
  • int* - это тип "указатель на int"
  • int* [] - это массив type"(с неизвестной границей / длиной) указателя на int"
  • int* p[] is объявление переменной или параметра с именем p вышеуказанного типа.
0 голосов
/ 05 декабря 2018
   int *p[]
//      ^

p равно

   int *p[]
//       ^^

p равно массив неопределенного размера (возможно, недопустимый, зависит от контекста)

   int *p[]
// ^^^^^

p - это массив неопределенного размера указателей на int

То есть каждый элемент p является указателем:

int foobar = 42;
p[0] = NULL;
p[1] = &foobar;
0 голосов
/ 05 декабря 2018

... указатель на массив указателей на целые числа

Нет, это не так.q это тип int *[].Это недопустимый (или, возможно, неполный, в зависимости от контекста) тип в C ++, и допустимый только в некоторых местах в C. Массивы должны иметь размер.

Тип int *[] представляет собой (нестандартный) массивуказатели на int.Сам по себе он не является указателем.


Возможно, путаница связана с тем, что массив может распадаться на указатель на свой первый элемент.

Например,, скажем, у нас есть этот массив:

int a[20];

Когда используется обычный a, он распадается на указатель на свой первый элемент: a равен &a[0].

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