2017-01-20 3 views
-2

Может кто-нибудь объяснить, почему я могу двигаться через ячейки памяти для полукокса *, но не для междунар *, используя следующий код:C указатель арифметика отличается для полукокса * и междунар *

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void){ 
int * a = malloc(48); 
char * s = malloc(27); 

for (int i = 0;i<26;i++) s[i] = i+65; 

int intSize = sizeof(int); 
printf("%d\n",intSize); 

for(int i = 0;i<12;i++){ 
    a[i] = i; 
    printf("%d %d %c\n",*(a+i*intSize),a[i],*(s+i)); 
} 


return 0; 
} 
+3

Поскольку выполнение 'a + i' будет автоматически увеличивать адрес на' i * sizeof (int) '. И вы дублируете эту функцию вручную, делая ее недействительной. –

+1

C достаточно умен, чтобы увеличивать указатель на размер типа даты, на который он указывает. Поэтому, если у вас есть 'int * p', то' p + 1' указывает на * следующий 'int' * не следующий байт. – lurker

+0

спасибо, это правильно на деньги – DCR

ответ

2

, когда вы объявляете переменную, например.

int* a; 
char* b; 

все значения смещения, в конце концов вычисляется как байт смещения, размер смещения зависит от типа.

так a + 1 в действительности a + sizeof(int) и b + 1 в действительности b + sizeof(char)

компилятор обрабатывает это, делает его легче читать код, в противном случае вы всегда должны вычислить, сколько байт типа имеет при перекручивание через массив и такие

2

char * имеет один байт. int * имеет (обычно) разрешение 4 байт. Приращение и декремент для указателя любого типа T идут на sizeof(T). Вот что делает арифметику указателя пригодной для использования.

+1

'int *' имеет разрешение 'sizeof int'. Существует множество реалий реального мира, где 'sizeof int' не' 4'. – Peter

+2

Таким образом, «(обычно)». –

+0

Просто потому, что это «обычный» для вас, не означает, что это обычно для всех. – Peter

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