指针的算术运算

    指针是C语言的一个重要的组成部分,是 C语言的核心、精髓所在,用好指针,可以在C语言的编程中起到事半功倍的效果。一方面,可以提高程序的编译效率和执行速度以及实现动态内存的分配。使用指针可以使程序更加的灵活,便于表示各种数据结构,编写高质量的程序。

    今天我们就来讨论一下指针里面比较难的部分:指针的算术运算

    和其他的普通变量一样,指针本质上也是一个变量,如果把指针称作地址变量,这样就很容易理解指针了。普通的变量可以进行加减运算,类似的,指针也可以进行加减运算。但是指针的加减运算又不同于普通的变量那样进行简单的加某一个数或者减某一个数。

    首先来看一下指针的加法:

    (1)指针+数字:

int main()
{
	int *p = (int *)2000;
	printf("%d\n",p+4);//2016
	printf("%d\n",(short *)p+4);//2008
	printf("%d\n",(double *)p+4);//2032
	printf("%d\n",(float **)p+4);//2016
	printf("%d\n",(unsigned short *)p+4);//2008
	printf("%d\n",(long *)p+4);//2016
	printf("%d\n",(char *)p+4);//2004
	printf("%d\n",(unsigned long long)p+4);//2004
	return 0;
}

    定义了一个整形的指针变量,由此结果可以看出,在进行指针的加法的时候,加的数字,需要调整,调整的权重就是sizeof(指针去掉一个*),简单来说,就是将指针的的*去掉一个只需要去掉一个就好了,再看剩下的部分是什么类型。如果还是一个指针,那调整的权重就是4或者8.(如果是32位的系统,指针的大小就是4,64位的系统,指针的大小就是8).short类型的就是两个字节,则调整的权重就是两个字节,double类型的是8个字节,调整的权重就是8.以此类推。但是需要我们注意的是:最后一个的类型可不是指针哦,而是直接把指针类型的变量直接强制转换为无符号的long long类型,此时他就是一个普通的数字,所以最后一个进行的就是数字的加法,直接用2000加上4,结果就是2004.所以在解决问题的时候,需要我们擦亮眼睛,认真的读题审题,抠细节,才能够成功

    (2)指针-数字:

    指针的加法解决了,现在需要解决的问题就是指针的减法,指针的减法和指针的加法都是大同小异的。

int main()
{
	int *p = (int *)0x2010;
	printf("%x\n",p-2);//2008
	printf("%x\n",(short *)p-2);//200c
	printf("%x\n",(unsigned long *)p-2);//2008
	printf("%x\n",(long long **)p-2);//2008
	printf("%x\n",(float *)p-2);//2008
	printf("%x\n",(double *)p-2);//2000
	printf("%x\n",(char *)p-2);//200e
	printf("%x\n",(unsigned long )p-2);//200e
	return 0;
}

    这里首先定义了一个指针变量为ox2010,虽然是16进制,但是在输出的时候,也要求我们输出16进制,所以就不用进行数制之间的转换,直接输出16进制就好了。这道题我们也很容易的用类似于加法的算术规则进行运算,就可以得出答案。但是在这里需要注意的就是16进制之间的加减运算。十六进制和十进制类似,只是本位上数值不够的时候,需要上一位借位16,然后在进行加减运算。同时需要注意的是,最后一位并不是指针,而是一个无符号类型的long类型的数据,在运算的时候,直接按照数字的运算进行就好了。

    看完了指针与数字之间的加减法,还有指针和指针之间的加减运算,下一篇博客再更新吧,哈哈偷笑偷笑偷笑

猜你喜欢

转载自blog.csdn.net/jojojo1234/article/details/79840540