有这样一个问题,比如定义一个 int i 变量,如何用指针访问这个变量的第一个字节?方法就是 :(char *)&i
在内存里面是一个字节一个地址编号,那么定义的 i 变量占4个字节,那么就有4个地址编号,指针里使用第一个字节(首字节)的地址编号来指向这个i变量的。
如下两句代码,
int i = 4096;
int * p = &i;
printf("%d\n",*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);//其他以此类推
这里我们用程序测试下行不行;
#include<stdio.h>
void 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("输入的数十进制为:%d\n",i);
print_b(&i,sizeof(i));
printf("\n");
c = *p;
printf("提取第一个字节内容十进制为:%d\n",c);
print_b(&c,sizeof(c));
printf("\n");
c = *(p+1);
printf("提取第二个字节内容十进制为:%d\n",c);
print_b(&c,sizeof(c));
printf("\n");
c = *(p+2);
printf("提取第三个字节内容十进制为:%d\n",c);
print_b(&c,sizeof(c));
printf("\n");
c = *(p+3);
printf("提取第四个字节内容十进制为:%d\n",c);
print_b(&c,sizeof(c));
return 0 ;
}
输出结果如下