有人可以解释为什么我可以使用以下代码遍历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;
}
答案 0 :(得分:3)
当您声明变量时,例如
int* a;
char* b;
所有偏移最终都计算为字节偏移量,偏移量的大小取决于类型。
所以a + 1
实际上是a + sizeof(int)
而b + 1
实际上是b + sizeof(char)
编译器处理这个,它使得更容易读取代码,否则你总是需要计算一个类型在循环数组时有多少字节等等
答案 1 :(得分:2)
char *
具有一个字节的分辨率。 int *
(通常)具有4字节分辨率。任何类型T的指针递增和递减sizeof(T)
。这就是使指针算法可用的原因。