Указатели - разница между массивом и указателем - PullRequest
3 голосов
/ 11 октября 2011

В чем разница между a, &a и адресом первого элемента a[0]?Точно так же p - указатель на целое число, присвоенное адресу массива.pointer[] сделает арифметику указателя и получит значение в соответствии с типом данных?Далее, какое значение ожидает *?Это должен быть указатель?

#include<stdio.h> 
int main()
{
int a[] = {5,6,7,8};
int *p = a;
printf("\nThis is the address of a %u, value of &a %u, address of first element %u, value pointed by a %u", a, &a, &a[0], *a);
printf("\nThis is the address at p %u, value at p %u and the value pointed by p %d", &p, p, *p);
printf("\n");
}

This is the address of a 3219815716, value of &a 3219815716, address of first element 3219815716, value pointed by a 5
This is the address at p 3219815712, value at p 3219815716 and the value pointed by p 5

Ответы [ 2 ]

2 голосов
/ 11 октября 2011
int a[]={5,6,7,8};
int *p= a;

Обратите внимание, что в случае массивов (в большинстве случаев), скажем, массив a, ADDRESS_OF a такой же, как ADDRESS_OF первый элемент массива .ie, ADDRESS_OF(a) такой жекак ADDRESS_OF(a[0]).& является оператором ADDRESS_OF и, следовательно, в случае массива a, &a и &a[0] являются одинаковыми.

Я уже подчеркивал, что в большинстве случаев имямассив преобразуется в адрес своего первого элемента;Единственное известное исключение - это когда он является операндом sizeof, что очень важно для работы с malloc.Другой случай, когда имя массива является операндом оператора & address-of.Здесь он преобразуется в адрес всего массива .Какая разница?Даже если вы думаете, что адреса будут в некотором роде «одинаковыми», критическое различие заключается в том, что они имеют разные типы.Для массива из n элементов типа T адрес первого элемента имеет тип указатель на T;адрес всего массива имеет тип «указатель на массив из n элементов типа T»;явно очень разные.

Вот пример этого:

int ar[10];
int *ip;
int (*ar10i)[10];       /* pointer to array of 10 ints */

ip = ar;                /* address of first element */


ip = &ar[0];            /* address of first element */
ar10i = &ar;            /* address of whole array */

Для получения дополнительной информации вы можете обратиться The C Book.

2 голосов
/ 11 октября 2011

В C указатели и массивы очень похожи.В вашем примере единственная разница между a и p заключается в том, что sizeof a - это 4 * (sizeof int), а sizeof p - это размер указателя, вероятно, 4 или 8 в зависимости от вашей платформы.Кроме этого, C не различает указатели и массивы.Таким образом, a [0], * a, p [0] и * p одинаковы.В некоторых случаях даже 0 [p] является действительным.Он просто делает арифметику указателей.

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