一、指针简介
指针是一种基本数据类型。
指针可有效地表示许多复杂的数据结构,如,队列、栈、链表、树、图等。
指针可以实现数组和字符串的方便使用。
指针使用上的灵活容易导致指针滥用二导致程序失控。
二、相关知识
内存
直接访问间接访问
三、什么是指针
1.指针是一种数据类型:表示 “地址号”,形式上看是一个正整数。
有指针常量、指针变量
2.指针变量的值的含义:该指针变量所指向的变量的内存地址号
3.空指针 NULL:
stdio.h中预处理命令定义的是一个特殊的指针常量。
值为0,如果一个指针变量值为NULL则它不指向任何目标变量。
四、*运算符
1.叫做间接访问运算符
2.单目运算符,右操作数四指针型变量
3.作用:取址&的逆运算,可理解成“取值”,“取数据”,返回值是该指针指向目标变量的值。
五、指针变量的定义
定义形式:数据类型 * 变量名
1)float * x;
这里的数据类型:用于限定指针变量x指向的目标变量的数据类型
即,定义了一个指针类型的变量x(x所指向的数据是一个float型数据),可以说x是一个浮点型指针变量。
2)float x,*p1,*p2;
五、指针变量的初始化
1.指针变量使用之前,必须对指针变量进行初始化。
为什么?
float * x;
完成指针变量的定义后,给x分配了它的存储空间,给并未给指针赋值,即这个所谓的“地址号”不确定,那么表示x指向谁不确定。
这时读它指向的内存的内容无意义。更糟糕的是,对当前指向的内存进行写入可能修改这个内存中原来存储的重要数据。
2.如何初始化——赋值运算符
1)变量的地址 —赋给—> 指针变量:这个变量必须先定义
float x,*p1=&x;
2)数组名 —赋给—> 指针变量:这个数组必须先定义
char ch[20],*cp=ch; //数组变量名就表示首元素的地址号
3)指针 —赋给—> 指针变量:这个指针必须是 已初始化的,同类型 指针
float x,*p=&x,*q=p;
4)初始化成空指针
int *p=NLLL;
或int *p=0;
除0外,不能给指针赋值常量,0是唯一能够直接赋给指针变量的整型数。
六、指针的基本运算
指针是一个地址值,虽然形式上看是一个正整数,但与一般整数有区别,有自己的运算规律。
1.赋值运算
类似初始化中的前3种:变量地址,数组名(数组的地址),同类型指针,非0整数
int a,*pa;
char ch[20],*cp;
char c,*s1=&c,*s2;
pa=&a; //第 1)种
cp=ch; //第 2)种
s2=s1; //第 3)种
注:赋值时不用写 * 的。初始化时前面的 * 是定义指针的部分。
2.算术运算与关系运算
1)哪些有意义——同数组!!
算术运算:
a.一个指针与一个整数:只能加减,针对同数组
b.指向同数组的两指针之间:相减
关系运算:
c.指针与NULL:可通过关系运算符==和!=判断一个指针是否为空指针
d.一个指针和一个整数:指针与整数比较无意义。
e.同一数组的两个指针:表示指向元素的前后顺序,指向元素的下标更大的指针值更大
例:
int a[10],*pa=a,*pb,*pc=&a[9];
int dist;
pa+=5; //指向a[5]
pb=pa-3; //指向a[2]
dist=pc-pa; //表示pc,pa两只指针指向的数组元素之间的距离为4
2)指针算术运算的意义:
指针的加减运算不是简单地址值的算术加减运算。指针加减运算的结果不以字节为单位。是表示“距离”的。就是所表示的地址号的值:一加加一个“单位”,不是一加加一个字节。
如上面的例子,对于指针变量pa,pa+5所表示地址号的值为pa+5sizeof(int),数组中,即a[5]。pc-pa结果为4,4个距离,实际二者表示的地址号差值是4sizeof(int)
3)注意:指针加减运算时注意是否越界,可能加的超出数组最末位的地址,或者减到小于数组首地址。
3.分类 总结
-
指针与整数:只能加减运算,且只有指向同一数组时。
1)赋值运算时,除0外整数不能赋值给指针。
2)算术运算,乘除无意义。可进行加减运算,用于数组。
3)关系运算:比较大小无意义 -
指针与指针
1)赋值运算:同类型指针之间,可赋值。
2)算术运算:同数组可相减,乘除,加。不同数组
3)关系运算:同数组两指针,与NULL