标签:
适用于地址加1
公式为 X+1 = (unsigned int) X + sizeof (* X) 其中 X 是个指针
解释:
int a [5] = {1,2,3,4,5};
计算 a+1 和 &a +1
利用公式
a+1 = (unsigned int) a + sizeof(*a) = (unsigned int) a + sizeof (a[0]) = &a[1] // a+1 指向 a[1]
&a+1 = (unsigned int) &a + sizeof(* & a) = (unsigned int) a + sizeof (a) = 数组后面的位置// &a+1 指向数组后面的地址
先搞清楚 X 的含义 ,如 数组名a 带表数组第一个元素的地址 才能得出正确的 *X
int b[2][3] = {{1,2,3},{4,5,6}};
计算 b+1 ,&b +1 ,b[1] +1,&b[1]+1,&b[0]+1
将二维数组看做特殊的 一维数组 int b[2] = {b0,b1}; b0 = {1,2,3} b1= {4,5,6} 数组名 b 表示 第一个元素的地址 ,即 b0的地址
b+1 = (unsigned int) b +sizeof( *b) = (uint) b + sizeof( b[0]) =b[1] // b+1 指向 b[1]
&b+1 =(unsigned int) &b + sizeof( * &b) = (uint)&b + sizeof (b) = 数组后面的位置
b[1] +1 = (unsigned int) b[1] + sizeof (* b[1]) = (uint)b[1] + sizeof (b[1][0]) = &b[1][1] // b[1] +1 指向 b[1][1]
&b[1]+1 = (unsigned int) &b[1] + sizeof (* &b[1])= (uint)&b[1] + sizeof (b[1]) = 数组后面的位置
&b[0]+1 = (unsigned int) &b[0] + sizeof (* &b[0])= (uint)&b[0] + sizeof (b[0]) = &b[1] = &b[1][0]
验证:
#include "stdio.h"
int main()
{
int b[2][3] = {{1,2,3},{4,5,6}};
int (*p1)[] = b+1; //b[1]地址
int *p2 = &b+1; //数组B后面的地址
int *p3 = b[1] +1; //5
int *p4 = &b[1] +1;// 数组B 后面的地址
int *p5 = &b[0]+1;// 4
printf("*p1 = %d\t p1=%d\n",*p1,p1); // P1指向 b[1] *p1 = b[1] = &b[1][0]
printf("*p2 = %d\t p2=%d\n",*p2,p2);// p2指向数组外
printf("*p3 = %d\t p3=%d\n",*p3,p3);// p3 指向b[1][1] *p3 = 5 p3 = &b[1][1]
printf("*p4 = %d\t p4=%d\n",*p4,p4);// p4指向数组外
printf("*p5 = %d\t p5=%d\n",*p5,p5);// p5 指向b[1][0] *p5 = 4 p5 = &b[1][0]
return 0;
}
标签:
原文地址:http://www.cnblogs.com/cloudddl/p/4916791.html