指针学完之后,对指针是否深刻理解,以下是一些关于指针的经典例题,通过例题可以回顾一下指针的相关内容:
代码示例1:
int main()
{
int a[5] = {
1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));//2,5
return 0;
}
代码详解1:
首先,&a表示的是整个数组的地址,其类型是int*[5],
(&a+1)表示跳过整个数组的地址,(int *)(&a + 1)
,强制类型转换为(int*)
类型,int *ptr = (int *)(&a + 1);
就可用下图来表示:
对于(ptr-1)
的位置上进行解引用即*(ptr - 1),
就可得到最后的结果为:5
同样,a
表示的是首元素的地址,(a+1)
表示指向第2个元素的地址,*(a+1)
表示对(a+1)
进行解引用,最后得到的结果为2
。
代码示例2:
struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
p = (struct Test*)0x100000;
printf("%p\n", p + 0x1);//0x100014
printf("%p\n", (unsigned long)p + 0x1);//0x100001
printf("%p\n", (unsigned int*)p + 0x1