有这样一个问题,比如定义一个 int i 变量,如何用指针访问这个变量的第一个字节?方法就是 :(char *)&i
在内存里面是一个字节一个地址编号,那么定义的 i 变量占4个字节,那么就有4个地址编号,指针里使用第一个字节(首字节)的地址编号来指向这个i变量的。
如下两句代码,
int i = 4096;
int * p = &i;
printf("%dn",*p);
上面的输出结果是 4096,那就有一个问题,既然p只存放了首字节的地址,那么* p是怎么指向 i 的,毕竟 i 占了4个字节, int * p 这里就要说*p前面的类型int了,前面的类型决定了以首字节开始找多少个字节,int型那就是4个字节,double型 那就是8个字节。(有点类似,一维数组两个重要参数:首地址、数组长度),
通过上面的了解,就可以来解决我们最开始提出的问题,char 占一个字节, 那么我们是不是可以这样,定义一个char型的指针,将 i 的地址强制转换成 char 型赋值给他,如下代码:
int i = 4096; char * q = (char *)&i; char c =*q;
这样我们就获得了 i 的首字节的地址。同时因为类型是char型,所以只访问这一个字节。这样我们就得到的第一个字节的内容,要得到其他字节呢,
假如首字节的地址是0001,那么其他字节的地址如上图,那么要获得第二个字节:
int i = 4096; char * q = (char *)&i; char c =*(q+1);//其他以此类推
这里我们用程序测试下行不行;
#includevoid print_b(void *pointer, size_t size) { unsigned long data = *((unsigned long*)pointer); int length = size*8; int counter = 0; printf("二进制: "); while(length-->0){ printf("%lu", (data>>length)&0x1); counter++; if(counter%8==0){ printf(" "); } } } int main (void) { int i = 158746; char * p =(char *)&(i); char c = 0; printf("输入的数十进制为:%dn",i); print_b(&i,sizeof(i)); printf("n"); c = *p; printf("提取第一个字节内容十进制为:%dn",c); print_b(&c,sizeof(c)); printf("n"); c = *(p+1); printf("提取第二个字节内容十进制为:%dn",c); print_b(&c,sizeof(c)); printf("n"); c = *(p+2); printf("提取第三个字节内容十进制为:%dn",c); print_b(&c,sizeof(c)); printf("n"); c = *(p+3); printf("提取第四个字节内容十进制为:%dn",c); print_b(&c,sizeof(c)); return 0 ; }
输出结果如下



