指针的引入
- 为函数修改实参提供支持
- 为动态内存管理提供支持
- 为动态数据及结构提供支持
- 为内存访问提供另一种途径
指针的概述
内存地址:
系统为了内存管理的方便将内存划分为一个个内存单元(一个内存单元占一个字节),并为每一个内存单元进行了编号,内存单元的编号称为该内存单元的地址。一般情况下,我们每一个变量都是有多个内存单元构成的,所以每个变量的内存地址其实就是这个变量对应的第一个单元的地址,也叫首地址
变量指针
变量地址称为该变量的指针,变量地址往往是指变量在内存中第一个内存单元的编号(首地址)
指针变量
存放其他变量地址的变量
指向
指针变量存放谁的地址,就说明该指针变量指向谁
指针运算符‘*’
案例:
/**
* 指针 初识
*/
#include <stdio.h>
void main()
{
// 定义一个普通/一般变量
int i = 3;
// 定义一个指针变量,并赋值
int *i_point = &i; // 指针变量的数据类型要和存储的地址变量类型一致
// 访问普通变量(直接访问)
printf("直接访问-%d\n",i); // 3
// 访问指针(地址访问)%p访问地址
printf("地址访问-%p\n",i_point);
// 访问指针变量(间接访问)
printf("间接访问-%d\n",*i_point); // 3
}
指针变量的定义
语法:
数据类型 * 变量列表
举例:
int a; // 普通变量
int *a,*b; // 指针变量
注意:
- 虽然定义指针变量*a,是在变量名前加*,但是实际变量名为a,而不是*a,
- 使用指针变量间接访问内存数据时,指针变量必须要有明确的指向
- 如果想借助指针变量间接访问指针变量保存的地址上的数据,可以使用指针变量前加*来直接访问;指针变量前加*;也称为对指针变量解引用
int i = 5, *p;
p = &i; // 将i的地址赋值给指针变量p
printf("%d\n",*p);// 间接访问i的值,也称为解引用p对应地址空间的值
4. 指针变量只能指向同类型的变量,借助指针变量访问内存一次访问的内存大小是取决于指针变量的类型
5.指针变量在定义同时可以初始化:这一点和普通变量是一样的
int i = 5;
int *p = &i; // 定义的同时初始化
指针变量的使用
指针变量的赋值:
// 方式1
int a,*p;
p = &a; // 指针变量的值是其他变量的地址
// 方式2
int a,*p,*q = &a;
p = q;
操作指针变量的值:
int a,*p,*q = &a;
p = q;
printf("%p",p); // 此时返回的是变量a的地址空间
两个有关运算符的使用:
- & 取地址运算符。 &a是变量a的地址。
- * 指针运算符 (或称“间接访问”运算符),*p是指针变量p指向的对象的值。
案例:
指针变量做函数的参数
指针变量做函数参数往往传递的是变量的地址(首地址),借助于指针变量间接访问是可以修改实参的变量数据的
两个有关运算符的使用
& 取地址运算符。 &a是变量a的地址。
* 指针运算符 (或称“间接访问”运算符),*p是指针变量p指向的对象的值。
案例:
#include <stdio.h>
void main()
{
int a,b;
int *pointer_1, *pointer_2;
a=100; b=10;
pointer_1=&a;
pointer_2=&b;
printf("a=%d,b=%d\n",a,b);
printf("pointer_1=%d,pointer_2=%d\n",*pointer_1,*pointer_2);
}