目录
指针的理解
变量的访问方式
内存地址与指针
指针变量
指针变量的定义
举例:
注意:
指针的应用场景
指针的理解
变量的访问方式
计算机中程序的运行都是在内存中进行的,变量也是在内存中分配的空间,访问内存中变量存储的数据有两种方式:直接访问和间接访问。
直接访问,直接使用变量名进行的访问,以前的程序中都是采用这种方式。
int num1 = 10;
int num2 = 20;
int num3 = num1 + num2;
间接访问,通过指针来实现。下面看如何理解指针。
内存地址与指针
为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。因为每个内存单元都有地址,所以变量存储的数据也是有地址的。
通过地址能找到所需的变量单元,可以说,地址指向该变量单元,将地址形象化地称为“指针”。
- 变量名:变量名是给内存空间取的一个容易记忆的名字。
- 变量值:在变量单元中存放的数据值。
- 变量的地址:变量所使用的内存空间的地址,即指针。
指针变量
指针变量:一个变量专门用来存放另一变量在内存中数据的地址(即指针),则它称为“指针变量”。我们可以通过访问指针变量达到访问内存中另一个变量数据的目的。
例如上图中地址 0x00000001 是变量 i 的指针, i_pointer 就是一个指针变量。体会:指针就是内存地址,使用指针访问变量,就是直接对内存地址中的数据进行操作。
指针变量的定义
一般格式:
数据类型* 指针变量名 [=初始地址值];
数据类型是指针变量所指向变量的数据类型。
- 可以是int、char、float等基本类型,
- 也可以是数组等构造类型。
字符* 用于告知系统这里定义的是一个指针变量。
举例:
int* p;
读作“指向int的指针”或简称“int指针”,这是一个指针变量,用于存储int型的整数在内存空间中数据的地址。
#include <stdio.h>
int main(){//交换两个变量的值
// int a=10;
// int b=20;
// int c;
// c=a;
// a=b;
// b=c;
// printf("a=%d\n",a);
// printf("b=%d\n",b);int a=10;int b=20;int* p1 =&a;;int* p2 =&b;;int* pt = 0;pt=p1;p1=p2;p2=pt;printf("a=%d\n",*p1);//20printf("b=%d\n",*p2);//10}
变形写法:
int *p;
注意:
- 指针变量的名字是p,不是*p。
- 指针变量中只能存放地址,不要将一个整数(或任何其它非地址类型的数据)赋给一个指针变量。
举例:
同一行声明两个指针变量 int* a, b;
指针变量的大小:不同类型的指针变量所占用空间大小是相同的,都是8个字节 。
#include "stdio.h"int main() {//声明指针变量int* p1;int *p2;int* p3,p4;int *p5,p6;//指针初始化赋值,走NULL关键字int* p7 = NULL;return 0;
}
指针的应用场景
场景1:
使用指针访问变量或数组的元素。
#include <stdio.h>
int main(){//为什么用指针加减操作//指针加减运算,非常适合连续的数据操作int arr[5]={11,22,33,44,55};int* p =&arr[1];printf("p==%d\n",*p);//28-2printf("p==%d\n",*(p+1));//33printf("p==%d\n",*(p-1));//11
}
场景2:
应用在数据结构中。比如: