指针的简单运算

博客指出指针相减大多无意义,仅当两个指针指向同一连续内存空间时相减才有意义,同时提到 == 和 != 是最有用的指针比较方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//64位系统可以生产32位的程序也能生成64位的程序。
//x86 32位程序
//x64 64位程序
int main(){
	int num = 10;
	int* p = #
	//32位系统下,一个指针是4个字节
	//64位系统下,一个指针8个字节

	//每个系统具体是占几个字节,其实是不确定的;32与64位系统中int占4个字节
	//
	printf("%d\n",sizeof( p));
	printf("char %d\n", sizeof(char));
	printf("short %d\n", sizeof(short));
	printf("int %d\n", sizeof(int)); 
	printf("long %d\n", sizeof(long));
	
	system("pause");
	return 0;
}

在这里插入图片描述

//一个指针变量提供两方面的信息
//1.某个内存的地址是哪
//2.这个内存的空间大小是多大
int main(){
	int num = 10;
	int* p = #
	printf("%d\n", sizeof(p));
	double num2 = 10.0;
	double* p2 = &num2;
	printf("%d\n", sizeof(p2));

	//p2 = p; //不同的类型的指针不能不应该相互赋值

	//void* 和空指针是完全不相干的两回事
	//void* 表示一个指针只知道地址但不知道房间大小是多大。
	void* p3 = p;//瘸了,所以任何类型的指针都能赋值给void*
	p3 = p2;//瘸了,所以任何类型的指针都能赋值给void*
	
//void*不能解引用
	void* p4 = p;
	printf("%d\n", *p4);//会有波浪线报错

	system("pause");
	return 0;
}

在这里插入图片描述

	//1.指针 + - 整数
	//指针+1意味着,地址往后(变大)跳过一个元素
	char* p = NULL;
	printf("%p\n", p+1);
	short* p2 = NULL;
	printf("%p\n", p2 + 1);
	int* p3 = NULL;
	printf("%p\n", p3 + 1);

在这里插入图片描述

	//指针减一意味着,地址向前跳过一个元素
	char* p = 0x100;
	printf("%p\n", p -1);
	short* p2 = 0x100;
	printf("%p\n", p2 - 1);
	int* p3 = 0x100;
	printf("%p\n", p3 - 1);

在这里插入图片描述

	//2.指针-指针
	//两指针之间隔了几个元素。
	//0x10 -> 16,  4个int刚好16个字节
	int* p1 = 0x100; 
	int* p2 = 0x110;
	printf("%d\n", p2 - p1);

	char* p3 = 0x100;  //强制类型转换 (char*)0x100
	char* p4 = 0x110;
	printf("%d\n", p4 - p3);

在这里插入图片描述
指针相减,大部分情况下是没有意义的。
只有当两个指针指向同意连续的内存空间的时候,相减才有意义

	int arr[] = { 9, 5, 2, 7 };
	int* p1 = &arr[0];
	int* p2 = &arr[2];
	printf("%p\n", p1);
	printf("%p\n", p2);
	printf("%d\n", p2-p1);
	//3.指针的关系运算。
	// <  > <= >= == !=
	//指针比较比较的是指针变量中存储的地址是否相同
	int num1 = 10;
	int* p1 = &num1;
	int num2 = 10;
	int* p2 = &num2;
	if (p1 == p2){
		printf("hehe\n");
	}
	else
	{
		printf("haha\n");
	}
	//为啥不能直接用==比较字符串?因为c语言中字符串使用字符数组来表示的,而单独拿出数组名相当于首
	//元素的地址,用==比较就相当于比较两个指针变量是否相等,比较的依据是指针变量中保存的地址

	char str1[] = "hehe";
	char str2[] = "hehe";
	if (str1 == str2){
		printf("hehe\n");
	}
	else{
		printf("haha\n");
	}
		//strcmp 其实能比较两个字符串的大小
	if (strcmp(str1, str2) == 0){
		printf("hehe\n");
	}
	else{
		printf("haha\n");
	}

在这里插入图片描述
== 和 != 是最有用的指针比较

int arr[] = { 9, 5, 2, 7 };
	int* p1 = &arr[0];
	int* p2 = &arr[2];//等价于 int* p2=arr+2
	int* p3 = arr + 2;
	if (p2==p3){
		printf("hehe\n");
	}
	else{
		printf("haha\n");
	}

	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值