Указатель - это адрес в памяти.
Если у вас есть int*
, это адрес int.
Теперь у вас есть два разных способа доступа к значению по этому адресу.
int a = 1;
int *ptr = &a; // ptr is the address of a
printf("%d\n", *ptr); // should print "1" because *ptr is the content at the address stored in ptr
Теперь, когда мы работаем с массивом, этот синтаксис не так легко читать, так что есть другой синтаксис, который:
int array[4] = { 21, 42, 84, 64 };
// Here array is also an address, the address of the first element
printf("%d\n", array[1]); // this should print "42"
В самом деле, когда вы используете синтаксис массива aka array[1]
, это точно так же, как если бы вы делали *(array + 1)
.
Именно поэтому первый элемент массива [0], потому что это похоже на то, что вы делали *(array + 0)
.
Итак, если у вас есть указатель (или массив, это то же самое), *ptr == ptr[0]
.
вложу каждый ответ на свой вопрос на примере:
int x[4] = {12, 20, 39, 43}, *y;
y = x;
*y + 1; // 13
*(y + 1); // 20 (same as y[1])
y += 2; // y is now the address of 39
*y = 38; // { 38, 43 }
*y - 1; // 37
*y++; // 43 (y++ then *y)
*y; // 43
y[0]; // 43
Символ «*» оператор применяет на весь блок справа от него. *y + 1 is like y[0] + 1
и *(y + 1)
, как у [1] `
Когда вы увеличиваете указатель (делая ptr += 2
или ptr++
), адрес фактически увеличивается на размере элемента.
int y = 42;
int *ptr = &y;
ptr += 2; // ptr is now 8 bytes (2 * syzeof(int)) further &y
EDIT: Если вы хотите более подробную информацию о приоритетах оператора, вы также можете посмотреть по этой ссылке. http://en.cppreference.com/w/c/language/operator_precedence
Для указателя 'T * p',' p [N] 'определяется как' * (p + N) '. Вот и все. – DeiDei
Какое из предложений, по вашему мнению, изменит (а) 'y'? – obe
Не могли бы вы изменить свой код и сделать его законным? Прямо сейчас то, что вы написали, не будет компилироваться. –