指针的加法需要调整,指针在加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类型单元格
{
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 去掉'*',这里虽然它是无符号的长整型数据,但其单元格大小仍然不变
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",(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 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 由于没有'*',则输出的是两个地址间的差值,不进行调整
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;
}
}