指针的基本用法
-
1.掌握指针的基本用法
-
2.总结与思考
指针的作用
-
使程序简洁、紧凑、高效
-
有效的表示复杂的数据结构
-
动态分配内存
-
得到多余一个的函数返回值
地址和变量
-
在计算机内存中,每一个字节单元,都有一个编号,称为地址。
-
在C语言中,内存单元的地址称为指针,专门用来存放地址的变量,称为指针变量。
-
在不影响理解的情况下,有时对地址、指针和指针变量不区分,统称指针。
一般形式如下: <存储类型> <数据类型> *<指针变量>
例如:char *P;
指针的存储类型是指针变量本身的存储类型。
指针说明时指定的数据类型不是指针变量本身的数据类型,而是指针目标的数据类型。简称为指针的数据类型。
指针在说明的同时,也可以被赋予初值,称为指针的初始化
一般形式是:
<存储类型> <数据类型> *<指针变量名> = <地址量>;
例如:int a,*p = &a;
是把变量a的地址作为初始值赋予了定义的int类型的指针p。
例:
#include<stdio.h>
int main()
{
int a = 10;
int *p;
p = &a;
//打印指针p的地址以及指针p的长度
printf("&p = %p %d\n",&p,sizeof(p));
printf("%p\n%p\n",&a,p);
return 0;
}
运行结果:
&p = 0x7ffed3c557b0 8
0x7ffc10ecbbcc
0x7ffc10ecbbcc
指针指向的内存区域中的数据称为指针的目标
如果它指向的区域是程序中的一个变量的内存空间,则这个变量称为指针的目标变量,简称为指针的目标。
#include<stdio.h>
int main()
{
int a = 10;
int *p;
p = &a;
printf("%d d%p\n",a,*p);
return 0;
}
运行结果:
10 10
*p的值是10,即变量a是指针p的目标变量,10是指针p的目标,也可以说是指针变量p所指向的a的地址上的值。
引入指针要注意程序中的p、*p、&p三种表示方法的不同意义。设p是一个指针,则:
-
p——指针变量,它的内容是地址量。
-
*p——指针所指向的对象,它的内容是数据。
-
&p——指针变量占用的存储区域的地址,是个常量。
总结与思考
-
什么叫指针?
指针就是内存地址,即内存以地址进行编号,这个编号就是指针。 -
指针占几个字节?指针占几个字节与语言无关,而是跟系统的寻址能力有关,例如16位系统,就占两个字节,32位系统占4个字节,64位系统占8个字节。
指针的运算
-
指针运算是以指针变量所存放的地址量作为运算量而进行的运算
-
指针运算的实质就是地址的计算
-
指针运算的种类是有限的,它只能进行赋值运算、算术运算、关系运算。
指针的算术运算
指针算术运算见下表:
运算符 | 计算形式 | 意义 |
---|---|---|
+ | p+n | 指针向地址大的方向移动n个数据 |
- | p-n | 指针向地址小的方向移动n个数据 |
++ | p或p | 指针向地址大的方向移动1个数据 |
-- | p--或--p | 指针向地址小的方向移动1个数据 |
- | p-px | 两个指针之间相隔元素的个数 |
指针相加运算
例:
#include<stdio.h>
int main()
{
int a = 10;
int *p;
double b = 5, *q;
p = &a;
q = &b;
//P指针的地址和p指针地址+2的地址
printf(" %p %p\n",&p,p+2);
//P指针的地址和p指针地址+2的地址
printf(" %p%p\n",&q,q+2);
return 0;
}
运算结果:
0x7ffe30e87220 0x7ffe30e87224
0x7ffe30e87230 0x7ffe30e87238
指针相减运算
-
p-q运算的结果是量指针指向的地址位置之间间隔数据的个数。因此,两指针相减不是两指针持有的地址相减的结果。
-
两指针相减的结果值不是地址量,而是一个整数值,表示两指针之间相间隔数据的个数。
例:
#include<stdio.h>
int main()
{
int a[5]= {1,2,3,4,5};
int *p,*q;
p = a;
q = &a[3];
printf("%p %p\n",p,q);
printf("%d %d\n",*p,*q);
printf("%ld\n",q-p);/*指针相减*/
return 0;
}
运算结果:
0x7ffcfa0a8140 0x7ffcfa0a814c
1 4
3
指针加加(p++)、指针减减(p--)
-
是地址的加1、减1操作。
指针的关系运算符
运算符 | 说明 | 例子 |
---|---|---|
> | 大于 | px>py |
< | 小于 | px<py |
>= | 大于等于 | px>=py |
<= | 小于等于 | px<=py |
!= | 不等于 | px!=py |
== | 等于 | px==py |
-
两指针之间的运算关系表示它们指向的地址位置之间的关系。指向地址大的指针大于指向地址小的指针。
-
指针与一般整数变量之间的关系运算没有意义。但可以和零进行等于或不等于的关系运算,判断指针是否为空。
例:
#include<stdio.h>
int main()
{
int *p = NULL;
/*指针和零比较判断指针是否为空*/
if(p == 0)
printf("%d %p\n",p,p);
return 0;
}
运行结果:
0 (nil)
0表示指针为空,nil表示无,任何变量在没有被赋值之前的值都为nil。