指针算数运算

指针的加法需要调整,指针在加1时,增加的是一个单元格。(这里的加法指的是加数字,指针加指针是非法的)
调整的权重为指针去掉一个'*',再判断其所属类型,然后求sizeof.

接下来用几个例子来具体说明.
int main()
{
 int *p = (int *)100;                      //首先定义*p的值为100
 printf("%d\n",p+4);                    //116,由于数据类型默认为int类型,int类型单元格的大小为4,所以增加的值为16
 printf("%d\n",(char *)p+4);        //104,去掉'*',可知增加的4个单元格是char类型单元格
                                                   //char类型单元格的大小为1,所以增加的值为4
 printf("%d\n",(short *)p+4);      //108,同理,去掉'*',其数据类型为short,而short类型单元格的大小为2,所以增加8
 printf("%d\n",(unsigned long *)p+4);      //116   去掉'*',这里虽然它是无符号的长整型数据,但其单元格大小仍然不变
                                                                  //长整型的单元格大小为4,因此增加的值为16
 printf("%d\n",(long long)p+4);  //104     这里需要注意的是由于其数据类型后面没有'*',因此表示的含义是对p直接加4
 
printf("%d\n",(char **)p+4);      //116      对于拥有多个'*'的情况,在去掉一个'*'后,其表示的为指针
printf("%d\n",(int ****)p+4);      //116      而指针的单元格大小为4,因此,增加的值为16
 return 0;
}

虽然指针加指针是非法的,但是指针减指针是有意义的。
调整的权重为指针去掉一个'*',再判断其所属类型,然后求sizeof.

指针减指针表示的是间隔的单元格数。这个值也会根据具体的数据类型进行调整。
例如:

int main()

{
 int arr[10] = {0};        //x    设置一个数组,假定它的第一个数据的初始地址的值为x
 int *p = &arr[1];       //x+4           接着设置一个p,它保存的是第二个数据的地址
                                  //                 由于是int类型的数据,那么它的值为x+4
 int *q = &arr[9];       //x+36         再设置一个p,它保存的是第10个数据的地址,值为x+36
 printf("%d\n",p-q);  //-8              p与q的地址差值为-32,接下来,由于默认的是整型,因此除以4,得到-8
 printf("%d\n",q-p);  //8               q与p的地址差值为32,由于默认的是整型,因此除以4,得到8
 printf("%d\n",(char **)q-(char **)p);   //8   q与p差值为32,这里去掉'*'后,为一个指针类型,指针类型单元格大小为4
 printf("%d\n",(short *)q-(short *)p);  //16     去掉'*',可知是一个short类型数据,short数据类型大小为2,除以2得到16
 printf("%d\n",(double *)q-(double *)p);  //4    去掉'*',double数据类型大小为8,除以8得到4
 printf("%d\n",(char *)q-(char *)p);       //32      去掉'*',char数据类型大小为1,除以1得到32
 printf("%d\n",(long long)q-(long long)p);//32   由于没有'*',则输出的是两个地址间的差值,不进行调整
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值