2015-08-26 2 views
2
int main() 
{ 
    int a[] = {1,2,3,4,5}; 
    printf("Base Address of array = %p\n",a); 
    printf("Address1 = %p \t Address2 = %p\n",a+1,&a+1); 
    return 0; 
} 

В принтере оба символа «a» представляют собой базовый адрес массива, но первый увеличивает его на 4 байта, а второй на 20 байтов. Любая конкретная причина?Добавление к целочисленному базовому адресу массива C?

Выход:

Base Address of array 0x7fff2059b240                               
Address1 = 0x7fff2059b244   Address2 = 0x7fff2059b254 
+0

'a' - массив, ** не ** указатель! – Olaf

ответ

3

Два понятия:

  1. Арифметика указателей на основе размера заостренный-типа. Другими словами, если у вас есть указатель на тип T, то добавление 1 к этому указателю даст вам адрес следующего объекта типа T.

  2. исключения случаев, когда это операнд из sizeof или одинарных & операторов, выражения типа «N-элемент массива T» будет преобразованы («распад») к выражению типа «указатель на T », а значение выражения будет адресом первого элемента массива.

Вы объявили a в 5-элементного массива int а. Предполагая 4-байтовый int, массив занимает 20 байтов.

выражениеa «затухает», чтобы ввести int *, так что добавление 1 к нему дает адрес следующего int объекта следующим a (IOW, это то же самое, как &a[1]).

Выражение &a имеет тип int (*)[5] (указатель на 5-элементного массива int), так что добавление 1 к нему дает адрес следующего 5-элементного массива int.

1

размер того, что &a указывает на 20 байт (весь массив: 4 байта х 5 элементов), в то время как размер того, что a указывает на 4 байта (один int). Тот факт, что они оба по одному адресу, не имеет значения; это разные способы интерпретации того, что находится на этом адресе.

+0

Итак, вы имели в виду, что «a» - это целочисленный указатель, а если используется & a, то указатель будет обрабатываться как указатель на массив – Khanna

+0

'a' - это указатель на первый элемент целочисленного массива (и, следовательно, указатель на целое число) , а '& a' - указатель на весь массив. –

1

При увеличиваем a+1a на самом деле указатель на int так его увеличенными 4 байт, то есть размер междунар. Но когда вы делаете &a, он становится адресом массива из 5 ints, поэтому, если вы увеличиваете его, вы пропустите размер массива из 5 целых чисел.

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