Каково значение разыменованного указателя - PullRequest
1 голос
/ 22 декабря 2009

Я понял, что у меня была путаница в отношении значения разыменованного указателя, когда я читал текст C со следующим фрагментом кода:

int main() 
{ 
    int matrix[3][10];                 // line 3: matrix is tentatively defined
    int (* arrPtr)[10] = matrix;       // line 4: arrPtr is defined and initialize
    (*arrPtr)[0] = 5;                  // line 5: what is the value of (*arrPtr) ?

Моя путаница связана со значением * arrPtr в последней строке. Это мое понимание до этого момента.

Строка 3, матрица объявлена ​​(предварительно определена) как массив из 3 элементов массива типа из 10 элементов типа int.

Строка 4, arrPtr определяется как указатель на массив из 10 элементов типа int. Он также инициализируется как ptr для массива из 10 элементов (т. Е. Первая строка матрицы)

Теперь строка 5, arrPtr разыменовывается, получая фактический массив, поэтому его тип - это массив из 10-ти int.

МОЙ вопрос: почему значение массива, просто адрес массива и никак не связано с его элементами?

Ответы [ 3 ]

1 голос
/ 22 декабря 2009

Значение переменной массива matrix равно массива, однако он (легко) «разлагается» на указатель на его первый элемент, который затем назначается arrPtr.

Чтобы увидеть это, используйте &matrix (имеет тип int (*)[3][10]) или sizeof matrix (равно sizeof(int) * 3 * 10).

Кроме того, в этом определении нет ничего условного.

Редактировать: Я пропустил вопрос, скрывающийся в комментариях к коду: *arrPtr - это объект типа int[10], поэтому при использовании [0] вы получаете первый элемент, чтобы который вы затем назначаете 5.

Указатели и массивы преднамеренно определены для того, чтобы вести себя одинаково, и это иногда сбивает с толку (прежде чем вы изучите различные причуды), но также чрезвычайно универсально и полезно.

0 голосов
/ 22 декабря 2009

В C массивы в значительной степени просто удобство. Все переменные «массива» - это указатели на начало блока данных; * * * * * int [] равнозначно int*, то есть местоположению в памяти типа int, int [][] - это двойной указатель, int**, который указывает на местоположение в памяти другого ... который в свою очередь указывает на фактический конкретный int.

0 голосов
/ 22 декабря 2009

Я думаю, вам нужно уточнить свой вопрос. Если вы имеете в виду значение printf("%i", arrPtr);, то это будет адрес массива. Если вы имеете в виду printf("$i",(*arrPtr)[0] );, тогда у нас более мясной вопрос.

...