笔试题1:
#include<stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int* ptr = (int*)(&a + 1);//取地址a,取出整个数组的地址,加一,指向数组后面的地址
printf("%d,%d", *(a + 1), *(ptr - 1));
//*(a+1)数组名a是数组首元素地址,加一是数组第二个元素的地址,解引用是2,
//ptr被强转为int*,所以减1,是取出数组第5个元素地址,解引用是5
return 0;
}
笔试题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);//结构体指针 加1就是加一个结构体大小20,地址是16进制所以答案就是00 10 00 14
printf("%p\n", (unsigned long)p + 0x1);//p被强转为(unsigned long)现在是一个整数,整数加一就是00 10 00 01
printf("%p\n", (unsigned int*)p + 0x1);//p被强转为(int*),加一就是加一个int*类型,00 10 00 04
return 0;
}
笔试题3:
int main()
{
int a[4] = { 1, 2, 3, 4 };//在内存中小端存储即01000000 02000000 03000000 04000000
int* ptr1 = (int*)(&a + 1);//取地址&数组名,拿到整个数组地址,加一就是拿到数组后面的地址
int* ptr2 = (int*)((int)a + 1);//数组名是数组首元素地址,地址被强转类型转换成int,然后加1,又重新转化成int*,此时地址加一,
//拿到的是00 00 00 02,再以小端还原出来就是02 00 00 00.
printf("%x,%x", ptr1[-1], *ptr2);
//ptr[-1]相当于*(ptr-1),就是数组第4个元素4.
return 0;
}
笔试题4:
int main()
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) };//注意里面是()逗号表达式,所以a数组里存的是
//1 3
//5 0
//0 0
int* p;
p = a[0];//拿到第一行元素的地址
printf("%d", p[0]);//打印第一行的首元素就是1
return 0;
}
笔试题5 :
int main()
{
int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int* ptr1 = (int*)(&aa + 1);//&aa拿到数组地址,加一就是数组后面的地址
int* ptr2 = (int*)(*(aa + 1));//二维数组,数组名aa拿到第一行的地址,加1后拿到第二行地址,再被强转为int*
printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));//ptr1-1拿到数组第10个元素的地址。ptr2-1拿到6前面的地址
return 0;
}
笔试题6:
#include <stdio.h>
int main()
{
char* a[] = { "work","at","alibaba" };//常量字符串放到表达式里是放字符串的首字符
char** pa = a;//拿到首元素地址
pa++;//地址加一,拿到"at"的地址
printf("%s\n", *pa);
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);//++改变cpp的指向,指向cp的第二元素,第一个解引用拿到cp中的c+2的地址,
//再解引用拿到POINT的地址,打印出POINT
printf("%s\n", *-- * ++cpp + 3);//++再次改变cpp的指向,解引用拿到c+1,再--就是c,再解引用拿到c的首元素
//c[0]存放'E'的地址,再加3,就是'E'的地址,打印就是ER
printf("%s\n", *cpp[-2] + 3);//相当于**(cpp-2)+3,cpp指向cp第3个元素地址,-2就是第一个元素地址,解引用拿到c+3,再解引用c+3指向c的4个元素,
//存放FIRST首元素F的地址,+3就是S的地址,打印就是ST
printf("%s\n", cpp[-1][-1] + 1);//相当于*(*(cpp-1)-1)+1,cpp-1指向cp第二个元素,解引用拿到c+2,再-1就是c+1,再解引用得到c的第2个元素,
//存放N的地址,加1就是E的地址,打印就是EW
}
有点难,建议收藏反复看