Динамические массивы и нотация указателей

#c #pointers #multidimensional-array #dynamic

#c #указатели #многомерный-массив #динамический

Вопрос:

Указатель является переменной или адресом?

Потому int** array= new int*[4] что это так запутанно.

Поскольку int** array в этом коде указатель становится переменными для хранения адресов указателей и new int*[4] становится адресами, которые будут сохранены в другом указателе.

Что я неправильно понимаю?

Комментарии:

1. Указатель — это переменная. Это значение является адресом. Точно так же, как у вас есть переменные int, значения которых являются целыми числами. Это ничем не отличается.

2. Я не уверен, что вы понимаете что-то не так, хотя ваша тематика немного странная. Переменные — это переменные, указатели или нет, они все одинаковые, за исключением того, что они содержат разные типы значений. Я думаю, вас смущает то, что указатель может указывать на что угодно, включая другой указатель. Это то, что int** array есть, это указатель, значение которого является адресом другого указателя, значение которого является адресом целого числа. Это двойной указатель.

3. Вот еще одна точка зрения, чем это (чего вы не понимаете) int** a = new int*[4] отличается от этого (что, я предполагаю, вы делаете) int* a = new int[4] ? В чем, по вашему мнению, причина того, что первое трудно понять, а второе в порядке? Если вы можете выделить int , почему вы не можете выделить int* ? Это единственное различие между двумя операторами,

Ответ №1:

Указатель — это тип данных, аналогичный int or char . Данные здесь представляют собой адрес памяти. Указатели определяются типами значений, которые, как ожидается, будут расположены в памяти по указанным адресам. Как и другие типы данных, указатели могут использоваться в качестве типов для переменных, аргументов функций, элементов массива и т. Д.

Итак, int **array это переменная типа int ** , которая означает указатель на значение типа int * , расположенное где-то в памяти. В свою очередь, int * означает указатель на значение типа int , расположенное где-то в памяти. Или, короче говоря, int ** является указателем на указатель на int .

Выражение new int*[4] означает выделение в памяти объекта типа int *[4] и возврат указателя на него. Тип int *[4] означает массив из четырех элементов типа int * , где int * , как мы уже знаем, означает точку к int значению.

Итак, при инициализации типы левой части ( int ** ) и правой части ( int *[] ) различны. Однако C способен автоматически преобразовывать массивы в указатели в случае, если тип элемента массива совпадает с типом значения, на которое ссылается указатель. В нашем случае тип элемента массива int * и тот же тип, на который ссылается указатель. Когда массив преобразуется в указатель, результирующий указатель будет ссылаться на первый элемент массива.

Ответ №2:

В этом объявлении

 int** array= new int*[4];
  

array это переменная, которая инициализируется адресом первого элемента динамически распределяемого массива с типом элемента int * .

Если у вас есть массив, объявленный как

 T array[N];
  

где T некоторый тип, тогда указатель на первый элемент массива может быть объявлен как

 T *p = array;
  

Если принять во внимание ваш массив, то просто T равно int * .

Ответ №3:

Проще говоря, указатель — это переменная, которая может хранить адрес другой переменной вместо int или float или какого-либо другого значения, такого как «обычная» переменная.

Как и любая другая переменная, сам указатель также имеет адрес, поэтому у вас может быть указатель на указатель, то есть указатель, который хранит адрес другого указателя.