程序员Feri一名12年+的程序员,做过开发带过团队创过业,擅长Java、鸿蒙、嵌入式、人工智能等开发,专注于程序员成长的那点儿事,希望在成长的路上有你相伴!君志所向,一往无前!
0.前言
计算机中程序的运行都是在内存中进行的,变量也是在内存中分配的空间,且不同类型的变量占用不同大小的空间。
那如何访问内存中变量存储的数据呢?
有两种方式:直接访问
和间接访问
。
直接访问,直接使用变量名进行的访问,以前的程序中都是采用这种方式。
间接访问,通过指针来实现。
1.指针
指针是 C 语言最重要
的概念之一,也是最难理解
的概念之一。
指针是C语言的精髓
,要想掌握C语言就需要深入地了解指针。
那么指针究竟是什么呢?来,先看看内存:
为了能够有效的访问到内存的每个单元(即一个字节),就给内存单元进行了编号,这些编号被称为该内存单元的地址。
因为每个内存单元都有地址,所以变量存储的数据也是有地址的。
比如:int num = 5;
通过地址能找到所需的变量单元,可以说,地址指向该变量单元,将地址形象化地称为“指针”。即:
变量
:命名的内存空间,用于存放各种类型的数据。变量名
:变量名是给内存空间取的一个容易记忆的名字。变量值
:在变量单元中存放的数据值。变量的地址
:变量所使用的内存空间的地址,即指针
。
指针变量
:一个变量专门用来存放另一变量在内存中数据的地址 (即指针),则它称为“指针变量”。我们可以通过访问指针变量达到访问内存中另一个变量数据的目的。(有时为了阐述方便,将指针变量直接说成指针。)
上图中,地址0x00000001是变量 i 的指针,i_pointer就是一个指针变量。
体会:指针就是内存地址,使用指针访问变量,就是直接对内存地址中的数据进行操作。
2.指针变量定义
一般格式:
数据类型 *指针变量名 [=初始地址值];
AI 代码解读
数据类型是指针变量所指向变量数据类型。可以是 int、char、float 等基本类型,也可以是数组等构造类型。
字符
*
用于告知系统这里定义的是一个指针变量,通常跟在类型关键字的后面。比如, char 表示一个指向字符的指针, float 表示一个指向 float 类型的值的指针。此外,还有指向数组的指针、指向结构体的指针。
举例1:
int *p; //读作:指向int的指针”或简称“int指针”
AI 代码解读
这是一个指针变量,用于存储int型的整数在内存空间中数据的地址。
变形写法:
int* p;
int * p;
AI 代码解读
注意:
1、指针变量的名字是 p,不是*p。
2、指针变量中只能存放地址,不要将一个整数(或任何其它非地址类型的数据)赋给一个指针变量。
3.指针的应用场景
场景1:使用指针访问变量或数组的元素。
场景2:应用在数据结构中。比如:
4.指针的运算
指针作为一种特殊的数据类型可以参与运算,但与其他数据类型不同的是,指针的运算都是针对内存中的地址来实现的。
取址运算符:&
取址运算符,使用“&
”符号来表示。作用:取出指定变量在内存中的地址
,其语法格式如下:
&变量
AI 代码解读
举例1:
int num = 10;
printf("num = %d\n", num); // 输出变量的值。 num = 10
printf("&num = %p\n", &num); // 输出变量的内存地址。&num = 00000050593ffbbc
AI 代码解读
说明:
1、在输出取址运算获得的地址时,需要使用“%p”作为格式输出符。
2、这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)。
指针变量的赋值
1、指针变量中只能存放地址(指针),不要将一个整数(或任何其它非地址类型的数据)赋给一个指针变量。
2、C语言中的地址包括位置信息(内存编号,或称纯地址)和它所指向的数据的类型信息,即它是“带类型的地址
”。
所以,一个指针变量只能指向同一个类型的变量,不能抛开类型随意赋值。
- char* 类型的指针是为了存放 char 类型变量的地址。
- short* 类型的指针是为了存放 short 类型变量的地址。
- int* 类型的指针是为了存放 int 类型变量的地址。
3、在没有对指针变量赋值时,指针变量的值是不确定的,可能系统会分配一个未知的地址,此时使用此指针变量可能会导致不可预料的后果甚至是系统崩溃。
为了避免这个问题,通常给指针变量赋初始值为0(或NULL),并把值为0的指针变量称为空指针变量
。
通过指针变量修改指向的内存中的数据
int main() {
int num = 10, *ptr;
ptr = #
printf("%d\n",num);
scanf("%d", ptr); //等价于scanf("%d", &num);
printf("%d\n",num);
return 0;
}
AI 代码解读
取值运算符
在C语言中针对指针运算还提供了一个取值运算符,使用“*
”符号表示。其作用与&相反
,根据一个给定的内存地址取出该地址对应变量的值。也称为解引用符号
。
其格式如下:
*指针表达式
AI 代码解读
其中,“*
”不同于定义指针变量的符号,这里是运算符。
“指针表达式”用于得到一个内存地址,与“*”结合以获得该内存地址对应变量的值。
举例1:
int main() {
int a = 2024;
int *p;
p = &a;
printf("%p\n",&a); //0000005cc43ff6d4
printf("%p\n",p); //0000005cc43ff6d4
printf("%d\n", *p); //2024
return 0;
}
AI 代码解读
其实,指针的运算还有很多,比如与整数的加减、自增自减等等,这里就不再一一叙说啦
好啦,关于指针就先说到这里,希望每天都可以学习一个知识点!