C语⾔指针偏移技巧(也是⼀个要注意的坑)
在C语⾔中,每个地址实际上指向⼀个8bit的内存区,但如果某个内存区的地址使⽤⼀个明确的类型指针例如int*、long*来进⾏保 存,那么指针偏移时地址的偏移数以类型占的字节数为基本单位进⾏偏移,例如int *p变量+1的时候实际上跳过的是sizeof(int)的类型字节数的地址为单位进⾏跳跃——也就是跳跃4个地址,但如果是不确认类型的情况下使⽤void*来保存,则必须指定每次跳跃的准确地址数。
以下是说明该机制的⼀个例⼦,测试平台为windows,使⽤gcc编译:
#include "stdio.h"
#include "stdlib.h"
void fun1(){
int *data = malloc(sizeof(int) * 4);
data[0] = 1;
data[1] = 2;
data[2] = 3;
data[3] = 4;
printf("%d\t%d\n", *data, *(data + 1));
}
void fun2(){sizeof 指针
void *data = malloc(sizeof(int) * 4);
*(int*)(data + sizeof(int) * 0) = 1;
*(int*)(data + sizeof(int) * 1) = 2;
*(int*)(data + sizeof(int) * 2) = 3;
*(int*)(data + sizeof(int) * 3) = 4;
printf("%d\t%d\n", *(int*)data, *(int*)(data + sizeof(int) * 3));
}
void fun3(){
int i;
void *data = malloc(sizeof(int) * 4);
int *data2 = malloc(sizeof(int) * 4);
printf("\n");
for(i = 0; i < 4; i++) {
printf("test1:%d\n", data + i);
}
printf("\n");
for(i = 0; i < 4; i++) {
printf("test2:%d\n", data2 + i);
}
}
int main(){
fun1();
fun2();
fun3();
return 0;
}
测试结果:
总结:指针的地址偏移的量和保存这个地址的指针类型有关
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论