对于char *和int *,C指针算法不同

时间:2017-01-20 21:16:07

标签: c pointers

有人可以解释为什么我可以使用以下代码遍历char *的内存位置而不是int *:

#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; 
}

2 个答案:

答案 0 :(得分:3)

当您声明变量时,例如

int* a;
char* b;

所有偏移最终都计算为字节偏移量,偏移量的大小取决于类型。

所以a + 1实际上是a + sizeof(int)b + 1实际上是b + sizeof(char)

编译器处理这个,它使得更容易读取代码,否则你总是需要计算一个类型在循环数组时有多少字节等等

答案 1 :(得分:2)

char *具有一个字节的分辨率。 int *(通常)具有4字节分辨率。任何类型T的指针递增和递减sizeof(T)。这就是使指针算法可用的原因。