C语言,指针的运算

指针的算术运算

指针是一个用数值表示的地址。可以对指针执行算术运算。可以对指针进行四种算术运算:++、–、+、-。

指针递增操作(++)

#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; 
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值