Если вы скомпилируете первую программу, вы получите предупреждение компилятора:
warning: initialization from incompatible pointer type
Поскольку тип p
является указателем на целое число, а тип &a
равен pointer to array of integer. Compiling the second program is fine, because again
p has type
int *and
a has type
int [] `(т. е. массив целых чисел), но в C вы можете просто передать / назначить целочисленный массив целочисленному указателю.Значению указателя присваивается начальный адрес массива.
Когда вы определяете массив с квадратными скобками в C, массив помещается сразу в стек или раздел данных, поэтому начальный адрес массивасовпадает с адресом самой переменной массива!Это отличается от массивов, созданных с помощью malloc
.
. Для вас это означает следующее: предположим, что переменная a
расположена по адресу 4e78ccba.Это означает, что &a
равно 4e78ccba.Но в C значение a
при передаче / назначении указателю по определению является адресом начала массива, так что это также 4e78ccba.
Опять же, есливы устанавливаете вещи с помощью malloc, все будет иначе.(Попробуйте !!) И, кстати, обратите внимание на предупреждения.:) Это интересный вопрос, потому что C настолько слабо напечатан, что только в первом случае предупредил вас.Языку со строгой типизацией не понравилось бы смешивание целочисленного указателя с указателем целочисленного массива.
ADDENDUM
Вот некоторый код, который показывает, как вы можете на самом деле различатьуказатель на первый элемент и указатель на весь массив :
#include <stdio.h>
int main() {
/* a is an array of ints, but can be used as a pointer to int */
int a[] = {11, 2, 3};
/* Using a as an int pointer */
int* p = a;
printf("%d\n", *(p+1));
/* Now here is how to make a pointer to the array itself! */
int (*q)[] = &a;
printf("%d\n", (*q)[2]);
return 0;
}
Эта программа выводит
2
3