一、指针概述
1.1、内存地址
- 计算程序使用的所有数据都存储在计算机的存储单元中,并能从存储单元中取出。
- 计算机中的每个存储单元都有唯一的地址。
- 计算机内存被划分为按顺序编号的内存单元,即内存地址。
- 内存单元的长度位8bits
- 程序中的变量,在编译时,系统才会给他分配内存单元(内存地址)。
- 变量是内存中某一块存储区域的名称,对变量赋值就相当于把值存储到该存储区域中。
32位内存中,一个内存单元所占的字节数
1个内存单元的长度是8bits,占一个字节。
32位是指地址长度,四个字节。
内存地址指向内存单元(可能1个或更多),32位系统每次读取的内存单元都是4个字节的偶数倍,可能会根据需1653要忽略多余的字节。
寻址地址是根据你的CPU的地址总线来确定回的,跟内存没多大关系。
至于8字节的内存单元是认为定答义,是为了兼容性和编程实现考虑的
1.2、内存和指针
变量的内存地址就是变量的指针
二、指针变量
int *p; p为指针变量
2.1、初识指针
&取地址符 关联变量与指针变量
#include "stdio.h"
void main()
{
int a,b; // 声明变量
int *p1,*p2,*p; // 声明指针
p1=&a; // 初始化指针,指针变量p指向变量a
p2=&b;
printf("请输入变量a和变量b\n");
scanf("%d %d",&a,&b);
if(a>b)
{
p=p1;
p1=p2;
p2=p;
}
printf("变量a的值是%d,指针变量p1的值是%d,*p1的值是%d%\n:",a,p1,*p1);
printf("变量b的值是%d,指针变量p2的值是%d,*p2的值是%d\n:",b,p2,*p2);
}
2.2、使用指针变量
2.3、指针的运算
- 指针的赋值
- 指针的相加
- 指针的移动
- 指针与指针的比较
- 指针与地址的比较
- p+n,p-n,++p,p++,--p,p--,其中n为整数
指针加上一个或者减去一个整数n,表示p向地址增加或者减小的方向移动n个元素单元,从而得到一个新的地址,使其能访问新地址中的数据,每个数据单元的字节取决于指针的数据类型
三、指针与函数
3.1、指向函数的指针
用指针变量可以指向一个函数,函数在程序编译时被分配一个入口地址,这个函数的入口地址称为函数的指针。
函数指针变量常用的用途之一是把指针作为参数传递到其他函数。指向函数的指针也可以作为参数,以实现函数地址的传递,这样能够在被调用的函数中使用实参函数。
3.2、返回指针的函数
函数可以返回数值型,字符型,布尔型等数据,也可以带回指针型的数据叫做返回指针值的函数
定义形式:
类型名 *函数名(参数表列)
int *max(int *x,int *y)
max函数调用后返回值的数据类型是整型指针
四、void指针类型
void指针类型,可以用来指向一个抽象类型的数据,在将它赋值给另外一个指针变量时要进行强制类型转换,使之适合于被赋值的变量的类型。
变量转换 一般形式:
- int *p1;
- void *p2;
- 将p2转换int类型 或者 将p1转换位void类型 p1 = (void*) p2 或 p1 = (int *)p2
函数转换的一般形式:
void *fun(char ch1,char ch2); fun函数返回的是一个地址,指向空类型,如果需要引用此地址,需要进行下列转换
p1=(char*)fun(ch1,ch2)
五、简单使用----链表
单链表又称线性链表,用它来表示线性表时,用指针表示空间节点的逻辑关系,单链表的一个存储节点包含数据域(data)和指针域两部分。
data部分用于存储线性表的一个数据元素,link部分用于存放一个指针,用于指示该链表下一个节点的开始存储地址。
链表的第一个节点称为首节点,它的地址可以通过链表的头指针找到,其他节点的地址通过前驱节点的link域找到,链表的最后一个节点没有后继,则在Link域放一个空指针Null,图中用^表示。