遇到的C语言指针变量的运算问题

本文详细探讨了C语言中的指针操作,包括指针的加减法、赋值运算、自增自减运算以及指针的相减运算。通过实例展示了指针如何通过地址值进行算术运算,并解释了指针加法和减法的规则。同时,文章还提到了字符指针和数组指针的用法。
摘要由CSDN通过智能技术生成
#include <stdio.h>
#define N 5

int main(void){
	// 但是通过加减法能够求出两个指针的差值,人为改变指针的指向 
	int arr[N], *p1, arr1[N];
	p1 = arr;
	printf("p1=%d\n", p1);
	printf("arr=%d\n", arr); // 6487520
	printf("arr1=%d\n", arr1); // 6487488
	p1 = p1 - 8; // 本质上是-8*4 = -32 
	printf("p1=%d\n", p1); // 6487488
	
	int arr2[N], *p2 = arr2;
	// int *num = {1,2,3,4}; 会报错 
	char *str = "hello!"; // 这样却不会报错 
	printf("p2=%x\n", p2);
	printf("str=%x\n", str);
	
	// 指针的加法(不改变指针) 
	int arr3[] = {1, 2, 3, 4}, *p3 = arr3;
	printf("arr3的第二位是=%d\n", arr3[1]);
	// 数组的指针p3默认是指向下标为0的元素 
	printf("*(p3+1)=%d,其地址为%x\n", *(p3+1), (p3+1));
	printf("p3=%d,没有改变还是指向第0个,p3的地址为%x\n", *p3, p3);

	// 指针的赋值运算(改变指针的实际指向)
	p3 += 1;
	printf("赋值后的p3所指向的值为%d,其地址为%x\n", *p3, p3); // 与上面的相同 
	
	// 自增自减运算
	printf("自增后:%d\n", *(++p3));
	printf("自减后:%d\n", *(--p3));
	
	// 相减运算() 
	int *p4 = &arr3[0];
	// 一个下标号是间隔一个对应类型的长度大小个单位 int是4 char是1 
	printf("p3=%d,地址为%d\n", *p3, p3); // arr3[1]地址为6487444
	printf("p4=%d, 地址为%d\n", *p4, p4); // arr3[0]地址为648440 
	// 在C语言中指针加法和减法都有不一样的规则:
	/*
	本质上就是对下标(加数)的转换(下标转换成对应的字节来相加或输出) 
	加法:会将所加的数乘对应类型的单位长度再相加 
	减法:会将减后的结果除以对应类型长度单位返回 
	*/ 
	printf("两个指针的差值为:%d\n", p3-p4); 
//	printf("两个指针的和值为:%d\n", p3+p4); 指针变量之间不能相加只能相减
	printf("两个指针的和值为:%d\n", p3+1); // 6487448 实际上是加了4个字节 
	
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值