栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

有这样一个问题,比如定义一个 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);//其他以此类推

这里我们用程序测试下行不行;

#include
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("输入的数十进制为:%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 ;

} 

输出结果如下

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/875223.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号