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

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

1 C语言中的&和*

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

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

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

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

如图,

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

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

  • 最后,对进行解引用,取出所引地址的存取的值。然后进行算术运算,得到。

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

14201729-c80f39734c7d2a5d.png
c_pointer.png

2 内存中的数组

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

int a[6];

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

14201729-0ff1894f8b1e2d69.png
array.png

对进行赋值,等于。

  • 声明一个指针;
  • ,并给指针赋值,这个值就是数组的地址,从图中可以看出来,这句赋值语句和是等价的;
  • 最后,,这句话的意思就是对指针所引的地址赋值。

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

14201729-4e946b9530cffb94.png
array_n_pointer.png

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

14201729-5f2c97be5b20d7b6.png
array_n_pointer2.png

猜你喜欢

转载自blog.csdn.net/weixin_33910759/article/details/87616508