指针的基本用法、指针的运算

指针的基本用法

  • 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。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值