1.
int main()
{
int a[5] = { 1,2,3,4,5 };
int* ptr = (int*)(&a + 1); //&a 拿到整个数组的地址 +1 跳过整个数组 然后强制类型转换成(int*)改变步长
printf("%d %d", *(a + 1), *(ptr - 1));//a为首元素地址 +1为第二个元素地址2 ptr为数组后面的地址 -1得到5
return 0; // 2 5
}
2.
struct Test
{
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p;
//已知,结构体Test类型的变量大小是20个字节
//假设p的值为0x100000。如下表达式的值为多少?
int main()
{ //本题考查的是指针+1到底加几个字节
p = (struct Test*)0x100000;
printf("%p\n", p + 0x1); //p为结构体指针 大小为20个字节 所以+1跳过20个字节 0x100014 00100014
printf("%p\n", (unsigned long)p + 0x1); //p强转成8字节的unsigned long型(不是指针) +1就单纯+1 0x100001被当做地址打印 00100001
printf("%p\n", (unsigned int*)p + 0x1);//p强转成4字节(x86环境)的整形指针 +1跳过4个字节 0x100004 00100004
return 0;
}
3.
int main()
{
int a[4] = { 1,2,3,4 }; //一个字节一个地址 地址+1 跳过一个字节
int* ptr1 = (int*)(&a + 1); //跳过整个数组 强转int* 调整步长
int* ptr2 = (int*)((int)a + 1);//把首元素地址强转成int类型+1 地址跳过一个字节 存入ptr2
printf("%x,%x", ptr1[-1], *ptr2); // 如果是小端 01 00 00 00 02 00 00 00 跳过01 访问四个字节小端逆序得到02000000
return 0; // 4 02000000
}
4.
#include<stdio.h>
int main()
{
int a[3][2] = { (0,1),(2,3),(4,5) };//数组初始化应用{} 这个是逗号表达式
int* p; //数组初始化为13 50 00
p = a[0]; //p存放首行地址
printf("%d", p[0]);//p[0]等价于 *(p+0) 为第一个元素 1
return 0; // 1
}
5.
#include<stdio.h>
int main()
{
int a[5][5];//5行5列的二维数组
int(*p)[4];// 数组指针 指向4个int大小元素的数组
p = a; //&p[4][2]->*(*(p+4)+2) p+1 跳过4个int +4 跳过16个int
//解引用向后访问4个int +2 在解引用 得到第三个元素->第19个元素
printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);//&a[4][2]->第23个元素
return 0;//低地址-高地址 FFFFFFFC -4
}// -4 的原码 10000000000000000000000000000100
// 反码 11111111111111111111111111111011
// 补码 11111111111111111111111111111100
// 按地址打印 F F F F F F F C
6.
#include<stdio.h>
int main()
{
int aa[2][5] = { 1,2,3,4,5,6,7,8,9,10 };//二维数组
int* ptr1 = (int*)(&aa + 1); //跳过整个数组 强转int* 改变步长
int* ptr2 = (int*)(*(aa + 1));//第一行+1 为第二行地址 解引用 为第二行首元素地址 改变步长
printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));// 10 5
return 0;
}
7.
int main()
{
char* a[] = { "work","at","alibaba" }; //指针数组a[0]存放w的地址 a[1]存放 a的地址 a[2]存放 a的地址
char** pa = a; //a为首元素 a[0]的地址 存放在 二级指针pa中
pa++; //pa放的是 a[0]的地址 +1 指向a[1]的地址
printf("%s\n", *pa); //解引用 为 at
return 0;
}
8.
int main()
{
char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;
printf("%s\n", **++cpp); // POINT
printf("%s\n", *-- * ++cpp + 3);//ER
printf("%s\n", *cpp[-2] + 3); //ST
printf("%s\n", cpp[-1][-1] + 1);//EW
return 0;
}