> 文章列表 > 从C出发 26 --- 指针 : 一种特殊的变量

从C出发 26 --- 指针 : 一种特殊的变量

从C出发 26 --- 指针 : 一种特殊的变量

指针变量, 是特殊的变量

在计算机内部逻辑上是一个一个存储单元,每个存储单元是一个字节

8 G  /16 G 表示的是存储单元的数量

如果要确定某一个具体的存储单元,要怎么办?

可以编号,这里的 0 1 2 3 指的就是内存地址内存地址指的就是存储单元的编号,每一个字节有一个编号,这个编号就是内存地址

内存地址是什么?  

是编号,显然就是一个整型数了


内存由一个一个存储单元组成,这些存储单元的单位是什么? 是字节 

这个整型变量占用了 4 个字节 ,这个整型变量的名字叫 var ,换句话说 var 就代表了这4个字节

除了使用定义的名字来访问这4个字节,还有没有别的办法来访问这 4个字节  通过内存地址

结论 :  在程序中除了可以通过变量名来具体的访问一个变量,使用一个变量之外,我们可以通过内存地址来访问一个变量,使用一个变量


程序元素包括变量数组元素

通过这个 & 操作符 来获取程序元素的地址,

内存地址打印出来会是什么样子?

无符号整数的样子

 

 这个打印出来的是一个16 进制数,这个16 进制数占用几个字节啊,占用4 个字节,换句话说,获取的地址是一个 4 字节的无符号整数


为什么我们说 32位系统/64位系统?

这个 32位 / 64位 指的是可访问的最大内存地址是多少

显然 64位系统比32位系统所运行的程序多的多


我们通过内存地址可以访问一个变量,但是我们也要注意,访问一个变量时,我们得指明这个变量所占用的字节数是多少

char*  pChar; //这里定义了一个指针变量,这个指针变量显然要保存一个内存地址,使用这个变量保存的内存地址,我们肯定可以使用它保存的数据,访问的数据长度,也就是范围是什么,是一个字节,我怎么知道是一个字节的呐? 因为是 char ,意味着通过这个变量所保存的地址访问内存时,只能访问一个字节


通过指针所保存的地址能够访问内存中的数据,具体怎么做呐?

通过这个 操作符就可以了,“  *   ”(指针访问操作符),这个具体访问什么?访问内存中的数据

int * p;  //定义了一个指针变量
...
printf("%d",);   //打印一个整型数,那么这个整型数怎么来呐? 通过 * 号作用于p,这个是什么意思?通过 * 号去访问内存中的数据,那么访问哪个内存地址中的数据呐?访问 p 这个指针所保存的内存地址中的数据,那访问的范围是什么?是 4 个字节

指针既然是变量,有没有类型呐?   就是数据类型加上 * 号

可以把  int *  这个整体看成一个指针类型,同样的把  char* 看成是一个整体,这个整体表示了一种指针类型

double 浮点类型 是一个普通的数据类型

double * 这个时候在double 后面加上一个* 号,这个整体变成了一种指针类型

所以我们定义指针变量的时候就会这样写,数据类型 加上 * 号   type* p ; 然后就是一个指针类型了,接下来就是指针的名字

为什么指针变量的类型统一占用 4字节或8字节?

因为指针变量是用来保存内存地址的,所以指针必须有能力保存任意一个地址值,因此必须是4字节或者8字节


NULL(专用于指针的名词) 这是一个零址,表示 0 地址  ,换句话说,在32位操作系统中这一个标识符就等价于 0x00 00 00 00 ,这个值就是 0,所以 

int * pVar = NULL; 这行代码就是想用 0 来初始化 pVar 这个指针变量

&var 取这个 var 变量的地址 ,将var这个变量的地址赋值给指针变量 pVar,这样这个指针变量就保存了var这个变量的地址,

然后通过访问操作符 * ,访问这个指针中内存地址里面的数据

#include <stdio.h>int main()
{int var = 0;int* pVar = NULL;int another = 0;printf("1. var =  %d\\n", var);printf("1. pVar = %p\\n", pVar);  //因为指针变量里面保存的是地址,要打印地址的话,就要使用 %ppVar = &var;  //使用指针保存变量的地址*pVar = 100;  // *pVar 等价于 var ,var = 100   printf("2. var =  %d\\n", var);  printf("2. pVar = %p\\n", pVar);pVar = &another;  //改变了 pVar的指向,使得 pVar 保存 another 的地址     *pVar = 1000;    //another = 1000;  (通过pVar 这个指针改变了another这个变量的值)//(通过指针来改变内存中的数据)   通过 * 号访问操作符作用于pVar,也就是要访问这个指针 pVar 所指向的地址中的数据,这个地址中的数据其实就是 another 这个变量这个变量保存的数据printf("3. another=  %d\\n", another);  printf("3. pVar = %p\\n", pVar);printf("4. add ==> %d\\n", var + another + *pVar);   // 100 + 1000 + 1000 ==> 2100return 0;
}

 


总结 :

1.指针的本质是变量,而变量的本质是 容器,所以指针就为容器,而这种容器是用来装 内存地址的

2.在 C语言中就使用指针来保存程序元素的内存地址,比如用指针保存变量的地址

3.指针既然可以保存程序元素的内存地址,接着我们就可以使用指针访问所保存的内存地址当中的数据,具体怎么做?需要使用 * 操作符(访问操作符),通过 * 号,我们就可以访问指针所保存的内存地址中的数据

4.指针既然是变量,就有类型