C语言入门---第九章 C语言指针

  没学指针就是没学C语言! 指针是C语言的精华,也是C语言的难点。

  所谓指针,也就是内存的地址,所谓指针变量,也就是保存了内存地址的变量。不过人们往往不会区分两者的概念,而是混淆在一起使用。

 =====指针的概念=======

  计算机中的所有数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如int占用4个字节,char 占用1个字节。

  我们将内存中字节的编号称为地址或指针。

  一切都是地址

  C 语言用变量来存储数据,用函数来定义一段可以重复使用的代码,他们最终都要放到内存中才能供CPU使用。

  数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存中存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限,也可能只有读取权限的内存块就是数据。

  CPU只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知CPU要执行的代码以及要读写的数据的地址,如果程序不小心出错,在CPU要写入数据时给它一个代码区域的地址,就会发生内存访问错误。这种内存访问错误会被硬件和操作系统拦截,强制程序奔溃,程序员没有挽回的机会。

  CPU访问内存时需要的是地址,而不是变量名和函数名,变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,他们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。

  需要注意的是,虽然变量名、函数名、字符串名和数组名在本质上是一样的,他们都是地址的助记符,但在编写代码的过程中,我们认为变量名表示的是数据本身,而函数名,字符串名和数组名则表示的是代码块或数据块的首地址。

=====C指针变量的定义和使用(精华)=====

  1. 数据在内存中的地址也成为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。

  在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。指针变量的值就是某份数据的地址,这样的一份数据可以是数组、字符串、函数,也可以是另外的一个普通变量或指针变量。

   例如:

    int a = 100;

    int *p_a = &a;

    在定义指针变量p_a 的同时对它进行初始化,并将变量a 的地址赋予它,此时p_a就指向了a.值得注意的是,p_a需要的一个地址,a 前面必须要加取地址符&,否则是不对

  * 是一个特殊符号,表明一个变量是指针变量,定义p1、p2 时必须带*。而给p1、p2 赋值时,因为已经知道了它是一个指针变量,就没有必要再加上*。

  也就是说,在定义指针变量时必须带*,给指针变量赋值时不能带*。

=====关于 * 和 & 的谜题

  假设有一个int 类型的变量a ,pa 是指向它的指针,那么*&a 和&*pa 分别是什么意思呢?

  &a : 取变量a 的地址(等价于pa),

  *(&a): 表示取这个地址上的数据,等价于 *pa, 仍然等于a

=======指针变量的运算(加、减和比较运算)====

  指针变量保存的是地址,地址本质上是一个整数,所以指针变量可以进行部分于是奶奶。例如:加法、减法、比较等。

===9.4 C语言数组指针 (指向数组的指针)====

  数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素。数组中的所有元素在内存中是连续排列的,震哥哥数组占用的是一块内存。

  定义数组时,要给出数组名和数组长度,数组名可以认为是一个指针,它指向数组的第0个元素。在C语言中,我们将第0个元素的地址称为数组的首地址。

===========

  求数组长度: int len = sizeof(arr) / sizeof(int);

  sizeof(arr) 会获得挣个数组所占用的字节数,sizeof(int) 会获得一个数组元素所占用的字节数,他们相除的结果就是数组包含的元素的个数,即数组长度。

============

  如果一个指针指向了数组,我们就称它为数组指针。

  数组指针指向的是数组中的一个具体元素,而不是整个数组,所以数组指针的类型和数组元素的类型有关。

======C语言字符串指针(指向字符串的指针)=====

  

  

  

    

的。

猜你喜欢

转载自www.cnblogs.com/dagailun/p/12355278.html