什么是指针?
在使用指针之前我们需要对指针进行初步的了解,首先我们要知道什么是指针?
通过前面的学习我们已经知道了内存的存储方式,他是通过一个字节一个字节的连续存储单位进行内存的存储,每一个字节我们称为一个内存单元。为了能够正确的访问这些内存单元,就必须为每个内存单元编上一个号,根据一个内存单元的编号即可准确的找到该内存单元,以及提取该内存单元存储的数据。
这里的内存单元的编号就叫做地址,而这个地址就是我们所说的指针。
指针变量的定义
如果在程序中定义了一个变量,在对程序进行编译或运行时,系统会给这个变量分配内存单元,并确定他的内存编号,即变量的地址,也称变量的指针。而存放这个变量地址的变量被称为指针变量。
语法:
数据类型 *指针变量名
- 数据类型支持C语言的所有数据类型
- 指针变量名遵循C语言变量的命名规则
例如:int *p;
定义一个指针变量,p
为变量,int *
是类型。在这里我们也认为指针是一种数据类型。
指针变量的基本使用
1)指针变量赋值
语法:
指针变量 = &变量名;
- 其中&为取地址运算符
- 如果这里直接定义指针变量,而不进行初始化(即赋值),则指针为野指针。
- 定义指针时,可以将指针初始化为空指针,即将NULL(是一个值为0的宏常量)赋值给指针变量。
注:
1)野指针的危害:因为直接对指针进行定义而不进行初始化,则指针变量的指向空间就不确定,所以指针可能会操作到非法的内存空间,导致程序崩溃。
2)空指针的作用是防止指针变量变成野指针。
这里是将变量的地址赋值个指针变量,因为指针也表示的是一个地址。即指针变量的值可以代表这个指针指向以这个值为首地址的那块内存空间。如下图:
在定义指针变量并对这个指针进行初始化(即赋值)时,系统会自动地分配内存给指针,并且要将这个变量的地址赋值给这个指针,所以这个指针的内容就是变量的地址。
代码如下:
int main(){
// 定义一个野指针
int *p;
printf("%p",p); // 输出值为0000000000000000
// 定义一个空指针,防止指针变成野指针
int *f = NULL;
// 定义一个变量
int a = 3;
// 定义一个指针
int *t;
t = &a;
printf("a id: %p\n",&a); // 输出为0000007f555ff61c
printf("t id: %p\n",t); // 输出为0000007f555ff61c
// 还可以这样进行初始化
int *l = &a;
printf("l id: %p",l); // 输出为0000007f555ff61c
}
2)指针变量操作指向的内存空间
语法:
*指针变量
通过指针运算符(也称”间接访问“运算)*
对指针所指向的变量的地址的内容进行访问。并且可以通过指针变量访问和修改所指向的内存空间中的内容。代码如下:
int main() {
// 定义一个变量
int a = 3;
// 定义一个指针
int *t = &a;
// 可以通过 * 对变量的内容进行访问
printf("%d\n",*t); // 输出为3
// 改变指向内容的值
*t = 10;
printf("%d %d",*t,a); // 输出为10 10
}