1、
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1); //&a表示数组地址,加一即跳过整个数组后的地址,经过强类型转换赋给ptr
printf( "%d,%d", *(a + 1), *(ptr - 1)); //a为数组名表示首元素地址,加一即第二个元素地址,解引用即第二个元素2. //ptr指向整个数组后面,减一即指向元素5,解引用就得到5.
return 0;
}
打印2,5
2、
struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short sBa[4];
}*p; //p为结构体指针
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节(20的十六进制为14)
int main()
{
p = (struct Test*)0x100000;
printf("%p\n", p + 0x1); //0x1为十六进制的1,p+1跳过整个结构体所以地址加二十为0x00100014
printf("%p\n", (unsigned long)p + 0x1); //强类型转换p为长整型为1048576(十进制)再
//加一为1048577再打印出地址(十六进制)0x00100001
printf("%p\n", (unsigned int*)p + 0x1); //强制转换为无符号整形指针为加一跳过一个无符号整形
//指针(四个字节)-0x00100004
return 0;
}
3、
int main()
{
int a[4] = { 1, 2, 3, 4 };
int *ptr1 = (int *)(&a + 1); //&a为数组地址+1跳过了整个数组
int *ptr2 = (int *)((int)a + 1); //把首元素地址转换为整形(十进制)加一再转换整形指针(十 //六进 制),其实相当于地址十六进制加一,此时跳过了一个字节
printf( "%x,%x", ptr1[-1], *ptr2); //此时ptr1指向整个数组后面,而ptr1[-1]=*(ptr1-1)即减一指向
return 0; //数组最后一个元素再解引用为4.而ptr2为整形指针,跳过一个字节后打印四个字节。
} //而prt2的位置如下图,因为当前环境是小端存储所以低位在低地址,ptr2指向了01后面,所以打印2000000.
4、
#include <stdio.h>
int main()
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) }; //此处为逗号表达式最后为1,3,5后面补0填满数组
int *p;
p = a[0]; //a[0]为首元素地址,所以打印1
printf( "%d", p[0]);
return 0;
}