美文网首页
《深入理解计算机系统》——Ch2-MemoryⅡ

《深入理解计算机系统》——Ch2-MemoryⅡ

作者: shijiatongxue | 来源:发表于2019-01-21 15:38 被阅读0次

这一章继续学习内存。如何把C语言的变量存到内存,C语言中的指针和数组在内存的存取方式。

1 C语言中的&和*

第一次学习C语言是在数据结构课,当时老师说,

学过C语言不理解指针,相当于没学。

后来一次又一次听到类似的话,可以想象指针对于C语言的重要性。

  • & = 取地址运算符
  • * = 取值运算符,或者称为解引用。

如图,

  • 我们首先声明一个指向整形数的指针ptr
  • 声明两个变量,分别初始化为52
  • x变量进行取地址操作,然后赋值给指针ptr

这时,指针指向的是变量x,因为存取的是变量x的地址。

  • 最后,对ptr进行解引用,取出所引地址的存取的值。然后进行算术运算,得到y=1+5=6

可以看出,这一步操作等于y=1+x,只不过这里是为了理解指针的作用,写的等价方式。

c_pointer.png

2 内存中的数组

在C语言中声明一个长度为6的整形数组,如图

int a[6];

其中,a是数组名,返回的是数组的地址。那么数组的地址又是什么呢?在C语言中,一个数组的地址就是它的第一个元素的地址,这里a=\&a[0]

array.png

a[0]进行赋值,a[5]等于a[0]

  • 声明一个指针p
  • p=a,并给指针赋值,这个值就是数组的地址,从图中可以看出来,这句赋值语句和p=\&a[0]是等价的;
  • 最后,*p=0xA,这句话的意思就是对指针p所引的地址赋值0xA

注意,一条赋值语句,左边为地址,右边为值或者地址值。

array_n_pointer.png

对于左下角框框的内容,是对地址进行算术运算,C语言会自动根据指针索引对象的大小进行运算。
如,p=p+2,这句话等价于,p=*p+sizeof(int)*2=0x10+4*2=16+8=24=0x18从下图可以看到,指针p所指的位置发生了变化。往后移动了2个整型数(4bytes)的大小。

array_n_pointer2.png

相关文章

网友评论

      本文标题:《深入理解计算机系统》——Ch2-MemoryⅡ

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