指针的算术运算
指针是一个用数值表示的地址。可以对指针执行算术运算。可以对指针进行四种算术运算:++、–、+、-。
指针递增操作(++)
#include <stdio.h>
const int MAX = 3;//常量
int main () {
int var[] = {10, 100, 200}; // int 数组
int i, *ptr; // ptr 是一个 int* 指针
ptr = var; // ptr 指向了 var 数组的首地址
for ( i = 0; i < MAX; i++) {
printf("var[%d] 地址= %p \n", i, ptr );
printf("存储值:var[%d] = %d\n", i, *ptr );
ptr++;// ptr = ptr + 1(1 个 int 字节数); ptr 存放值+4 字节(int)
}
return 0;
}
图:
数组在内存中是连续分布的
当对指针进行++时,指针会按照它指向的数据类型字节数大小增加,比如 int * 指针,每++ , 就增加 4 个字 节
指针递减操作(–)
#include <stdio.h>
const int MAX = 3;//常量
int main () {
int var[] = {10, 100, 200}; // int 数组
int i, *ptr; // ptr 是一个 int* 指针
ptr = &var[MAX-1]; // ptr 指向了 var[2]
for ( i = MAX; i > 0; i--) {
printf("ptr 存放的地址=%p\n", ptr);
printf("存储值:var[%d] = %d\n", i-1, *ptr );
ptr--;// ptr = ptr - 1(1 个 int 字节数); ptr 存放值+4 字节(int)
}
return 0;
}
和上面++的方式一样
指针 + 操作
案例
#include <stdio.h>
int main () {
int var[] = {10, 100, 200};
int i, *ptr;
ptr = var; // 将 var 的首地址 赋给 ptr
ptr += 2; // ptr 的存储的地址 + 2 个 int 的字节 (8 个字节)
printf("var[2]=%d var[2]的地址=%p ptr 存储的地址=%p ptr 指向的值=%d", var[2], &var[2], ptr, *ptr);
return 0;
}
结论 &var[2] 与 ptr的值是一样的。
可以对指针按照指定的字节数大小进行 + 或者 – 的操作,可以快速定位你要的地址
指针 - 操作
#include <stdio.h>
int main () {
int var[] = {10, 100, 200};
int i, *ptr;
ptr = &var[2]; // 将 var[2] 的地址 赋给 ptr
ptr -= 2; // ptr 的存储的地址 - 2 个 int 的字节 (8 个字节)
printf("var[0]=%d var[0]的地址=%p ptr 存储的地址=%p ptr 指向的值=%d", var[0], &var[0], ptr, *ptr);
return 0;
}
课堂练习
int main () {
int var[] = {10, 100, 200, 400, 9, 12};
int i, *ptr;
ptr = &var[2]; // ptr 指向了 第 3 个元素
ptr -= 2;
printf("ptr 指向的值=%d", *ptr); // 10
return 0;
}
指针的比较
指针可以用关系运算符进行比较,如 ==、< <= 和 > >=。如果 p1 和 p2 指向两个变量,比如同一个数组中 的不同元素,则可对 p1 和 p2 进行大小比较, 看下面代码,说明输出什么?
案例 1
#include <stdio.h>
int main () {
int var[] = {10, 100, 200};
int *ptr;
ptr = var;//ptr 指向 var 首地址(第一个元素)
if(ptr == var[0]) {//错误,类型不一样 (int *) 和 (int )
printf("ok1");
}
if(ptr == &var[0]) { // 可以
printf("\nok2"); //输出
}
if(ptr == var) { //可以
printf("\nok3"); //输出
}
if(ptr >= &var[1]) { //可以比较,但是返回 false
printf("\nok4");//不会输出
}
return 0;
}
案例 2
#include <stdio.h>
const int MAX = 3;
int main () {
int var[] = {10, 100, 200};
int i, *ptr;
ptr = var;
i = 0;
while ( ptr <= &var[MAX - 2] ){ //&var[1]
printf("Address of var[%d] = %x\n", i, ptr );
printf("Value of var[%d] = %d\n", i, *ptr );
ptr++;
i++;
} //会输出 10 , 100
return 0;
}