C语言中变量在内存中的保存与访问

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: C语言中变量在内存中的保存与访问

CPU通过内存地址访问元素

int i=0x12345678

假如i的地址是0x100,那么在小端存储体系中

地址 数值
0x100 0x78
0x101 0x56
0x102 0x34
0x103 0x12
CPU访问内存需要同时具备两个因素:

内存基址:从哪里访问内存——就是地址
内存布局:访问几个字节(怎样解析,解释方法)
定义变量时指明的数据类型就是指明内存布局,i是int型变量,所以CPU知道连同0x100后面四个地址一起组成i的值

强制类型转换改变的就是解析方法,也就是内存布局

char p= (char)i

这样CPU会只将地址0x100中的0x78解析为一个char类型的字符然后赋给p

同理 short p=(short)i

得到的short型变量p的值是0x5678

这样看来,只要给定了内存基址和内存布局就可以不用实际变量名得到变量值

比如 (short )0x102实际上就是值0x1234

对于结构体变量来说也是如此解析的(虽然其中有内存对齐问题)

struct foo{

int first;
short second;
char third;

}*pfoo;

对于语句 pfoo->first中的->操作符,它首先算出右侧的变量在左侧结构体中的偏移量,然后让左侧变量的地址(指针所指地址)加上偏移量就实际上得到了右侧变量的内存基址,然后根据右侧变量类型,也就是得到了它的内存布局,这样两个因素都具备了也就得到了它的值

在一些实际应用中,会看到这样的链表应用方法:将链表嵌入到数据结构中(学校里用的链表大概都是将数据结构嵌入链表)

struct data_in_list{ //数据嵌入双向链表

int price;
....   //一些可能要用的数据
struct data_in_list *next;
struct data_in_list *pre;

}

//下面是链表嵌入数据结构中
struct list{

struct list *next;
struct list *pre;

}

struct list_in_data{

...//一些会用到的数据
struct list lnode;

}

比如在2.6版本的Linux内核中,这种数据结构是很常见的,进程描述符task_struct结构体中就包含链表节点,所有进程描述符是用一个双向链表连起来的,而根据链表节点访问结构体就是用到了上面说的CPU访问数据的两个要素

type 是结构体类型

address 是结构体中链表节点

field 是链表节点类型

(type)(address - &(((type)0)->field)) //(type*)0表示内存基址是0的type型变量,&符获得了field在type中的偏移量
//这样可以根据链表节点得到其所在的type结构体的地址,实际上可以根据结构体中任一变量得到整个结

column1 column2 column3
column1 column2 column3
column1 column2 column3
column1 column2 column3
相关文章
|
3天前
|
存储 C++
有没有简单的整形变量和整形指针变量在内存中的示意图呀
有没有简单的整形变量和整形指针变量在内存中的示意图呀
14 6
|
7天前
|
存储 缓存 C语言
【C语言】字符函数,字符串函数,内存函数
C语言中的字符串函数和内存函数
14 0
【C语言】字符函数,字符串函数,内存函数
|
14天前
|
存储 编译器 C语言
C语言3 变量
C语言3 变量
8 1
|
23天前
|
C语言
C语言15---在VC中变量的注意点和变量的注意细节
C语言15---在VC中变量的注意点和变量的注意细节
|
16天前
|
存储 设计模式 监控
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
25 0
|
23天前
|
C语言
C语言16---变量的注意细节
C语言16---变量的注意细节
|
23天前
|
存储 C语言
C语言14----变量的使用
C语言14----变量的使用
|
24天前
|
存储 JavaScript 前端开发
面试官:JS中变量定义时内存有什么变化?
面试官:JS中变量定义时内存有什么变化?
17 0
|
29天前
|
Java 程序员 Linux
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
探索C语言宝库:从基础到进阶的干货知识(类型变量+条件循环+函数模块+指针+内存+文件)
25 0
|
C语言
C语言初阶之常量和变量
在C程序执行过程中,其值不发生改变的量称为常量,其值可变的量称为变量。它们可与数据类型结合起来分类。例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。在程序中,直接常量是可以不经说明而直接引用的,而符号常量和变量则必须先定义后使用。