C语言:如何用指针访问一个变量(如int、double型)的某一个字节,

有这样一个问题,比如定义一个 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 ;

} 

输出结果如下
在这里插入图片描述

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值