美文网首页
理解C语言指针和内存地址的关系

理解C语言指针和内存地址的关系

作者: hooyaru | 来源:发表于2017-03-31 16:55 被阅读476次

一个内存地址存着一个对应的值,这是比较容易理解的。

如果程序员必须清楚地知道某块内存存着什么内容和某个内容存在哪个内存地址里了,那他们的负担可想而知。

汇编语法对“一个内存地址存着一个对应的数”,作了简单的“抽象”:把内存地址用变量名代替了,对内存地址的取值和赋值方式不变。

c语言对此进行了进一步的抽象:变量 <==>

(一个内存地址,对应的值)(这里忽略类型等信息)。

把C语言中的基本类型(int,long,float等),指针,数组等还原为(一个内存地址,对应的值)后,就能更清淅地理解它们了。

内存就相当于(addr,val)的大hash表,c语句的语义基本就是改变hash值。

什么叫hash表?:根据关键码值key直接进行内存访问的数据结构。

为了下文的方便,特定义如下语义(遵循C的标准语义):

var<==>(addr, val)(var为一个变量名,addr为var在内存中的首地址,val为var的值)

&var <==> addr

var<==>

var作为左值出现(即等式左边)时,var等价于 addr;

var作为右值出现(即等式右边)时,var等价于val;

*var <==> val

注:符号"<==>"右边出的等式x = y(x是一个内存地址,y是一个值);表示将内存地址为x的内容置为值y,如addr = 3表示置内存addr里的值为3

现在利用上面的语义解释一下这些例子:

int i = 3;

假设i的内存地址为0x8049320 ,那么这句话的语义是0x8049320 = 3,经过i =

3后,i为(0x8049320,3)

int b = i;

假设b的内存地址为0x8049324 ,那么这句话的语义是0x8049324 = i对应的val

= 3,此时b为(0x8049324,3)

int *p = &b

指针p也是一个变量,int **p,int *p[8],在这些申明中p都只是一个指针变量,它和其他的变量的不同之处在于它的大小是定的,它的类型信息只是编译器用来进行类型检查和其他一些作用的(如果没有类型检查,你可以用任何的方式对一个变量进行操作如int i; ****i = 3)。假设p的地址为0x8049328,则根据p = &b的语义p.addr = b.addr,p为(0x8049328,0x8049324)

*p = 5;

语义为0x8049324 = 5,此时只改变了内存地址为0x8049324的值,即改变了b的值(0x8049324,5),而p的值并未改变

int **q = &p; //如果写为int **q = &&i; gcc编译不通过

假设q的内存地址为0x8049330,语义为0x8049330 = addr(p) = 0x8049328;所以q为(0x8049330,

0x8049328)

(int **q = &&i,要是编译过了则q应该表示为(0x8049330,

x),内存地址为x的地方表示为(x,0x8049320),那么地址x为多少呢? )

**q = 6

语义为val(val(q)) =

val(0x8049328) = 0x8049324 = 6,将内存地址为0x8049324的内容置为6,即将b的值置为6,b为(0x8049324,6)

对于结构,这些语义也适用,因为结构里的成员也是有对应地址的,也能表示为(addr,val)的形式。

相关文章

  • 闲聊c/c++: 谈内存(大/小端,高/低字节,高/低地址)

    c/c++和其他语言最大区别在于: 指针 指针就是内存地址,一旦明白了指针与内存地址相关的内容,那理解其他语言,就...

  • 2.7-C语言入门-指针

    1.指针的含义-变量的地址 a.指针:C语言中用“指针”来表示内存地址(即:指针指向了内存地址),即“指针”可理解...

  • 理解C语言指针和内存地址的关系

    一个内存地址存着一个对应的值,这是比较容易理解的。 如果程序员必须清楚地知道某块内存存着什么内容和某个内容存在哪个...

  • Golang 指针和结构体

    Golang 指针和结构体 于c语言相同,go中也有指针和结构体的概念。指针表示变量的内存地址,结构体用来存储同一...

  • OC引用计数

    C与OC的比较 在C语言中,只存在内存地址的分配和释放。同一个内存地址可以被多个指针指向。 int number ...

  • php 引用遇到的问题

    最近遇到这样的问题 第一个foreach 首先理解&,它指向变量的内存地址,可以理解为C语言中的指针。ok ,先看...

  • 值传递、地址传递的笔记

    在C语言中,理解值传递、地址传递和引用传递非常重要,首先,我们得来区分一下指针变量、指针地址、指针的值之间的关系。...

  • 第12章 指针和数组

    英文原版 P527 理解指针和数组的关系,对于掌握C语言是非常关键的,因为这会让你深入理解C语言是如何设计的,以及...

  • C语言05- 指针

    C语言05- 指针 13:指针 指针是C语言中的精华,也是C语言程序的重点和难点。 13.1:指针定义与使用 指针...

  • 对Java中HashCode方法的深入思考

    前言 最近在学习 Go 语言,Go 语言中有指针对象,一个指针变量指向了一个值的内存地址。学习过 C 语言的猿友应...

网友评论

      本文标题:理解C语言指针和内存地址的关系

      本文链接:https://www.haomeiwen.com/subject/ppuvottx.html