конфликт указателей и массивов - PullRequest
0 голосов
/ 12 апреля 2011

пусть

int*p ,b = 5;
p = &b;

обозначает ОДИН ИЗМЕРЕННЫЙ массив, тогда каков выход, полученный с помощью следующего оператора

printf("%d",p);

это адрес? если это адрес, то скажите мне, к какому элементу он принадлежит, пожалуйста, объясните четко

Ответы [ 4 ]

1 голос
/ 12 апреля 2011
p = &b

Этот не обозначает массив!Как я объяснил здесь , это не одно и то же.b это просто целочисленное значение.Если вы объявите b как int b[] = {1, 2, 3};, то p будет указывать на первый элемент b.

printf("%d",p);

Это выведет значение p, а поскольку pуказатель и указывает на b, это напечатает адрес b.printf("%d", &b); даст тот же результат.
Кстати, если бы b был массивом, b[5] был бы переведен в *(p + 5), так что вы можете читать (и записывать) значения, добавляя количество элементовв начале массива.И b[5] == p[5] == *(b + 5) == *(p + 5) !!!Но не потому, что массивы и указатели - это одно и то же, а потому, что имя массива преобразуется в адрес первого элемента.
В качестве примечания, компиляторы всегда используют обозначения указателей (*(base + offset)) при компиляции в сборку.

0 голосов
/ 12 апреля 2011
int*p ,b = 5;
p = &b;

в точности соответствует:

int b = 5;
int *p = &b;

p заканчивается указателем на int. Теперь верно, что этот код будет иметь почти такой же эффект на то, что заканчивается в p (хотя b имеет совершенно другой тип и значение), как это:

int b[1] = {5};
int *p = b; // or int *p = &b[0];

безусловно, в любом случае p указывает на int, которое вы можете рассматривать как простое int, или как первый (и единственный) элемент в одномерном массиве размера один. Итак, то, что следует, является законным и дает значимые результаты в обоих случаях:

printf("%d is stored at %p\n", *p, p);
printf("%d\n",p[0]);

но на этом сходство заканчивается.

0 голосов
/ 12 апреля 2011

Указатель p обозначает , а не обозначает одномерный массив.Это просто указатель на целое число.Он может указывать на первый элемент массива, например, когда вы делаете int* p = new int[6], но это нечто совершенно другое;в этом случае вы выделяете пространство для нового массива из шести целых чисел и сохраняете адрес первого (или начала массива) в p.

Если вы напечатаете p, это будетраспечатайте адрес памяти, который он хранит.Если p «обозначает массив» (с акцентом на кавычки), вы напечатаете адрес первого элемента массива.

0 голосов
/ 12 апреля 2011

адрес первого элемента массива. (если b был массивом) используйте p ++ для прокрутки массива

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...