C 语言 第五章 指针(4)
目录
指针的常用运算
同类指针相减运算
格式:
实例
举例:
指针间的比较运算
举例:
实例
指针的常用运算
同类指针相减运算
格式:
指针 - 指针
注:
- 相同类型的指针允许进行减法运算,返回它们之间的距离,即相隔多少个数据单位(注意:非字节数)。
- 高位地址减去低位地址,返回的是正值;低位地址减去高位地址,返回的是负值。
实例
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int* p1 = &arr[0];
int* p2 = &arr[3];
printf("p2-p1=%d\n", p2 - p1); //3 等同于(地址p1 - 地址p2)/4 ==> 3
return 0;
}
体会:
两个指针相减,通常两个指针都是指向同一数组中的元素才有意义。结果是两个地址之差除以数组元素的长度。不相干的两个变量的地址,通常没有做减法的必要。
举例:
#include "stdio.h"
int main() {
//同类指针相减运算 同类型 连续
int arr[5] = {[0]: 1, [1]: 2, [2]: 3, [3]: 4, [4]: 5};
int* p1= &arr[0];
int* p2= &arr[3];
printf("%d\n",p2-p1);
printf("%d\n",p1-p2);
return 0;
}
#include <stdio.h>
int main(){
//为什么用指针加减操作
//指针加减运算,非常适合连续的数据操作
int arr[5]={11,22,33,44,55};
int* p =&arr[1];
printf("p==%d\n",*p);//28-2
printf("p==%d\n",*(p+1));//33
printf("p==%d\n",*(p-1));//11
}
指针间的比较运算
指针之间可进行==、!=、<、<=、>、>=比较,比较内存地址大小,返回1(真)或0(假)。
举例:
int main(){
int arr[5] = {1, 2, 3, 4, 5};
int* p1 = &arr[0];
int* p2 = &arr[3];
printf("%d\n",p1 > p2); //0
printf("%d\n",p1 < p2); //1
printf("%d\n",p1 == p2); //0
printf("%d\n",p1 != p2); //1
return 0;
}
实例
int main() {
int arr[] = {10, 20, 30};
int *ptr;
ptr = arr; //ptr指向arr首地址(第一个元素)
if (ptr == arr[0]) { //错误,类型不一样
printf("ok1\n");
}
if (ptr == &arr[0]) { // 可以
printf("ok2\n"); //输出
}
if (ptr == arr) { //可以
printf("ok3\n"); //输出
}
if (ptr >= &arr[1]) { //可以比较,但返回false
printf("ok4\n");//不会输出
}
if (ptr < &arr[1]) { //可以比较,返回true
printf("ok5\n");//输出
}
return 0;
}