指针是变量, 是特殊的变量
在计算机内部逻辑上是一个一个存储单元,每个存储单元是一个字节
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); //因为指针变量里面保存的是地址,要打印地址的话,就要使用 %p
pVar = &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 ==> 2100
return 0;
}
总结 :
1.指针的本质是变量,而变量的本质是 容器,所以指针就为容器,而这种容器是用来装 内存地址的
2.在 C语言中就使用指针来保存程序元素的内存地址,比如用指针保存变量的地址
3.指针既然可以保存程序元素的内存地址,接着我们就可以使用指针访问所保存的内存地址当中的数据,具体怎么做?需要使用 * 操作符(访问操作符),通过 * 号,我们就可以访问指针所保存的内存地址中的数据
4.指针既然是变量,就有类型