指针 + 数字 和 指针 - 指针的一些问题

在进行指针相减或指针加数字时需要进行一些调整。

指针变量(指针)中存放的是地址。

指针 + 数字:指针加法需要调整,调整的权重为指针本身去掉一个*号,求sizeof。如下图.1

指针 - 数字:指针加法需要调整,调整的权重为指针本身去掉一个*号,求sizeof。如下图.1

举例:int *p;p+2的值为p的值加上2*sizeof(int)个字节。

#include<stdio.h>

int main()
{
	int *p = (int *)1000;
	//把地址强转为int型的指针,值为1000
	printf("%d\n",p+2);
	//结果为:p = p +2*sizeof(int) = 1008;
	printf("%d\n",(char ***)p+2);
	//结果为:p = p+2*sizeof(char **) = 1008  因为char **是一个指针类型,所有的指针类型的权重都为四个字节
	printf("%d\n",(short *)p+2);
	//结果为:p =p + 2*sizeof(short) = 1004;
	printf("%d\n",(short *)p-2);
	//结果为:p = p - 2*sizeof(short) = 996;
	printf("%d\n",(double **)p+4);
	//结果为:p = p + 4*sizeof(double *) = 1016;
	printf("%d\n",(double **)p-2);
	//结果为:p = p - 2*sizeof(double) = 992;
	printf("%d\n",(unsigned long *)p+2);
	//结果为:p = p + 2*sizeof(unsigned long) = 1008;
	printf("%d\n",(char *)p+2);
	//结果为:p = p + 2*sizeof(char) = 1002;
	printf("%d\n",(unsigned long long)p+2);
	//单纯的加2,p = p +2 = 1002;

	return 0;
}

                                                                             图 .1

指针 + 指针:是非法的,一个指针加上一个指针不能表示为两个指针变量中的地址相加

指针 - 指针:是合法的,得出的结果是间隔的单元个数。如下图.2

在指针减指针中,需要对指针进行调整,调整的权重为sizeof(指针去掉一个 *),

计算方法为:1.计算间隔的字节数   2.字节数除以指针的权重

#include<stdio.h>

int main()
{
	int arr[10] = {0};//假设整型数组arr的地址从0开始,一个单元格占四个字节
	int *p = &arr[1];//arr[1]的地址为 4
	int *q = &arr[7];//arr[7]的地址为28
	printf("%d\n",p-q);//结果为 (4 - 28) / 4 = -6
	printf("%d\n",q-p);//结果为 (28 - 4) / 4 = 6
	printf("%d\n",(short *)q-(short *)p);
    //结果为 (28 - 4) / 2 =12 (权重为sizeof(short)四个字节);
	printf("%d\n",(long long*)q-(long long *)p);
    //结果为(28 - 4) / 8 = 3(权重为sizeof(long long)八个字节);
	printf("%d\n",(double *)q-(double *)p);
    //结果为(28 - 4) / 8 = 3 (权重为(sizeof(double))八个字节);
	printf("%d\n",(unsigned long)q-(unsigned long)p);
    //因为没有*,结果为 28 - 4 = 24;
	printf("%d\n",(char **)q-(char **)p);
    //去掉一个*后为 char *(是一个指针类型,所有的指针类型的权重都为四个字节),(28-4)/4=6;
	return 0;
}

                                                                                 图.2

扫描二维码关注公众号,回复: 2510172 查看本文章

猜你喜欢

转载自blog.csdn.net/jwhazt/article/details/81317549