前言
指针的学习一共有三个阶段:
一、指针基础:
- 指针概念
- 指针变量定义、引用
- 指针传参
二、指针进阶
- 指针 + 一维整型数组
- 指针 + 一维字符型数组
三、指针高阶
- 指针 + 二维整型数组
- 指针 + 二位字符型数组
- 指针的数组:指针 + 函数 指针 + 指针
本篇文章主要介绍指针基础,剩余两个阶段在在后面介绍。
-------------------------------------------------------------------------------------------
指针的基础:
一、指针概念
1、概念
指针(Pointer):是一种特殊的变量,储存了另一个变量的地址,而不是它的值。这个地址可以指向储存在计算机内存中的数据。
指针是一种用于存储其他数据类型变量地址的数据类型:
这个类型指示了指针指向的变量的数据类型。例如,如果定义一个指向整数的指针,它的类型就是 int *
;如果是指向字符的指针,类型就是 char *
,依此类推。
2、指针的用途
指针的作用和用途:
-
动态内存分配:指针可以用于在运行时动态分配内存。
-
传递参数:指针可以用于传递函数参数,通过指针可以直接修改函数外部的变量值,而不是传递变量的副本。
-
复杂数据结构:指针允许创建和操作复杂的数据结构,如链表、树等,这些结构经常需要动态分配内存和处理不同节点之间的关系。
-
提高效率:指针允许直接访问和操作内存,因此在某些情况下比直接操作变量更高效。
二、指针变量定义及引用
1、语法
基本类型 * 指针变量名
基本类型:
整型(int)、浮点型(float)、字符型(char)、数组型、指针类型、函数型……
表示:该指针 所指向的内存空间 应该存放什么类型的数据
* :指针运算符(解引用)
用于声明和操作指针,
例如 int *p (声明了一个指向整数的指针变量p);这个只能取地址,因为指针是储存另一变量的地址的。
例如 * p (取指针p 所指向地址 的值)。
指针变量名
与标识符命名规则一致。
2、指针的引用
1、* p
含义:p所指向的内存地址的值。通俗来讲就是,p所指向的变量的值。
应用:
int a=10;
int *p=&a // 定义一个指向整形的指针变量p,把a的首地址赋给p。
如果要修改a的值:
*p=20; //把20赋给a。
总结 :
指针的作用之一,也是非常重要的一点,就是通过访问地址,直接修改变量的值。
* p 属于间接访问;通过 a 访问的是 直接访问。
3、指针的初始化
指针的初始化有多种形式:
- int a=10; int *p=&a;
- int *p= NULL;
- int *p; p=NULL;
- int a; int *p; p=&a;
未初始化的指针可以包含任意的内存地址值,这取决于变量的存储位置和先前存储的内容。因此,使用未初始化的指针进行解引用或其他操作会导致未定义的行为,这可能会引发程序崩溃或产生难以预测的结果。
总之,在声明指针变量时,确保在需要使用之前初始化它。如果不确定是否初始化,始终初始化为 NULL
是一种良好的做法,这样可以在不需要指向特定地址时保持指针处于安全状态。
三、指针传参
我们肯定会有这样一个疑问,为什么要存在指针这种特殊的变量呢?它有什么作用?
答案就是:指针80%的作用就是:被调修改主调。
要实现被调修改主调,就需要指针作为函数参数。
1、被调修改主调的含义
在C语言中,"被调修改主调"通常是指通过函数参数传递指针,使得被调函数可以修改主调函数中的变量的值。这种方法允许函数在执行过程中直接访问和修改主调函数中的数据,而不需要通过返回值或全局变量来传递修改后的结果。
具体来说:
-
指针传递:当你将变量的地址(即指针)传递给函数作为参数时,函数可以通过这个指针间接访问和修改该变量的值。
-
修改主调函数中的变量:被调函数(也称为子函数或子程序)可以通过操作指针所指向的内存位置来修改主调函数(调用它的函数)中相应变量的值。
举个例子来说:
#include <stdio.h>
void modify(int *p) {
*p = 20; // 修改主调函数中变量的值,modify (修改)
}
int main() {
int num = 10;
printf("Before calling modify: %d\n", num);
modify(&num); // 将num的地址传递给modify函数
printf("After calling modify: %d\n", num); // num被修改为20
return 0;
}
2、指针 作为函数参数
- 形参:指针类型 变量,用来接收实参(实参是要操作的内存空间的地址)
- 实参:要修改谁 就把谁的 地址 传过去
注意:被调函数中一定要有 *p 运算 (间接访问的操作);
值传递 // 实参数据 赋值了形参
地址(指针)传递 //传的是地址 --可以实现被调修改主调
总结
指针的基础,要理解指针的本质,指针p 储存了另一个变量的内存空间的地址,要回正确引用指针,* p是所指向变量的值。然后要理解指针存在的意义,利用指数传参,实现被调修改主调。