2009-12-22 2 views
1

я понял, что я имел некоторую путаницу в отношении стоимости разыменованного указателя, как я читал текст 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 целых чисел.

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

ответ

1

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

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

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

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

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

+0

В выражении (* arrPtr) [0] = 5, учитывая, что индексный оператор [] требует указателя как одного из его операндов. Соответствует ли это требованиям? ArrPtr? –

+0

'* arrPtr' - это массив (arrPtr указывает на массив и вы его разыгрываете), и вы можете использовать индекс на массивах. C вызывает '[]' array-subscriptip и требует, чтобы один операнд был указателем, однако он полагается на унизительные массивы, см. 6.5.2.1/2 в стандарте C (который явно говорит об этом): http://www.open-std.org/jtc1/sc22/wg14/www/standards.html – 2009-12-22 20:22:45

+0

Собственно, пример в 6.5.2.1/4 также должен помочь. – 2009-12-22 20:25:49

0

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

+0

Это комментарий или ответ? – 2009-12-22 19:37:46

+0

Я думал, что * arrPtr имеет одинаковое значение в обоих режимах использования. Во втором индексе [] требуется, чтобы первый операнд был указателем на тип объекта. Я думал, что «адрес массива» соответствует этому требованию. –

0

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

+0

Нет, это неправильно. Как * функции параметры * 'int []' и 'int *' эквивалентны (обратите внимание даже на 'const', что некоторые люди ожидают), но не верно для' int [] [] 'и' int ** 'и любой другое использование массивов, отличных от параметров функции. – 2009-12-22 19:34:21

+0

Единственная разница, которую я знаю между этими формами, применяется, когда переменные изначально объявлены. При доступе к массиву нотация указателя ('* (a + i * sizeof (int))', где 'a' была объявлена ​​как массив из int), эквивалентна' a [i] ', не так ли? –

+0

Выполнение арифметики по переменной массива деградирует массив в указатель (а sizeof также неверно, арифметика указателя позаботится об этом). Это часть дизайна C, что массивы деградируют легко. Переменная массива по-прежнему не совпадает с указателем, см. Примеры '&' и 'sizeof' в моем ответе. – 2009-12-22 20:12:17

Смежные вопросы