(八)指针运算

指针只能用地址表达式表示,不能像普通整数那样对指针进行任意的运算。除单目的&和*运算外,指针所允许的运算还包括有限的算术运算和关系运算。

1.算术运算
指针的算术运算包括:指针加、减一个整数和两个指针相减运算及++、–运算。
(1)指针与整数的加减运算。
指针变量加上或减去一个整数n,是将指针由当前位置向前或向后移动n个数据的位置。通常这种运算用于将指针指向一个数组中的其他位置。
对于指向一般数据的指针变量,加减运算操作的作用并不大。由于各种类型的数据的存储长度不同,因此在数组中加减运算使指针移动n个数据后的的实际地址与数据类型有关。
例如,在Visual C++6.0编译环境中:
对于char型,对指针加1操作相当于当前地址加1个字节;
对于int型,对指针加1操作相当于当前地址加4个字节;
对于float型,对指针加1操作相当于当前地址加4个字节。
一般地,如果p是一个指针,n是一个正整数,则对指针p进行+n或-n操作后的实际地址是:
p+n乘以sizeof(数据类型)。其中,“sizeof(数据类型)”是取数据类型长度的运算符。
(2)自增、自减运算。指针变量自增、自减运算也是地址运算。指针加1运算后指针指向下一个数据的起始位置;指针减1运算后,指针指向上一个数据的起始位置。
指针自增、自减单目运算也分前置和后置运算,当它们与"*"运算符组成一个表达式时,两个单目运算符的优先级相同,其结合性为从右到左。
(3)两个指针相减运算。两个指针相减的运算只能在同一种指针类型中进行,他们主要应用于对数组的操作,其结果是一个整数而不是指针。例如,p1和p2是指向同一数组中的不同或相同元素的指针(p1小于或等于p2),则p2-p1的结果为p1和p2之间间隔元素的数目n。
例如,指针p1指向数组a[2],p2指向数组元素a[8];a[2]与a[8]之间隔6个元素,所以p2-p1的值为6。
2.关系运算
指针的关系运算表示它们所指向的地址之间的关系。两个指针应指向同一数组中的元素,否则运算结果无意义。指针间允许4种关系运算:
< 或 >:比较两指针所指向的地址的大、小关系。
==或!=:判断两指针是否指向同一地址,即是否指向同一数据。
例如,指针p1、p2指向数组中的第i、j元素,则下列表达式为真的含义为:
(1)p1<p2(或p2>p1)表示p1所指元素位于p2所指元素之前(或表示p1所指元素位于p2所指元素之后)。
(2)p1==p2表示p1和p2指向同一数组元素的地址。

指针不能与一般数值进行关系运算,但指针可以与零(NULL字符)之间进行等于或不等于的关系运算。例如:
p==0;p!=0;p=NULL;p!=NULL;
用于判断指针p是否为NULL指针。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的指针是一种特殊的变量类型,用于存储内存地址。指针变量存储的是某个对象的内存地址,而不是对象本身的值。 指针运算是对指针进行操作的过程。C语言中提供了一些基本的指针运算符,包括: 1. 取址运算符(&):用于获取变量的地址。例如,`int a = 10; int *p = &a;`中的`&a`表示变量`a`的地址。 2. 解引用运算符(*):用于获取指针变量所指向的对象的值。例如,`int a = 10; int *p = &a; printf("%d", *p);`中的`*p`表示指针变量`p`所指向的对象的值,即输出为`10`。 3. 指针加法运算:可以对指针进行加法运算。例如,`int a[5] = {1, 2, 3, 4, 5}; int *p = a; p = p + 2;`中的`p + 2`表示将指针变量`p`向后移动两个元素,即指向数组`a`的第三个元素。 4. 指针减法运算:可以对指针进行减法运算。例如,`int a[5] = {1, 2, 3, 4, 5}; int *p = &a[4]; p = p - 2;`中的`p - 2`表示将指针变量`p`向前移动两个元素,即指向数组`a`的倒数第三个元素。 5. 指针与整数的加法和减法运算:可以将整数与指针进行加法或减法运算。例如,`int a[5] = {1, 2, 3, 4, 5}; int *p = a; p = p + 2; p = p - 1;`中的`p + 2`表示将指针变量`p`向后移动两个元素,然后再减去一个元素,即指向数组`a`的第二个元素。 需要注意的是,指针运算要遵循一些规则和限制,以防止出现不可预料的错误。例如,对空指针进行解引用或越界访问数组等操作都是不安全的。在使用指针运算时,应该确保指针指向有效的内存地址,并且不越界访问数组。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值