指针笔试题
- 笔试题1
int main() { int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf( "%d,%d", *(a + 1), *(ptr - 1)); return 0; }
- 解析:
int a[5] = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); //&a + 1表示整个一位数组后一个数组地址,为int(*)[5]类型强制转化为int*类型 printf( "%d,%d", *(a + 1), *(ptr - 1)); // *(a + 1)表示第二个元素;*(ptr - 1)表示第五个元素 输出结果:2,5
- 笔试题2
//这里告知Test类型的结构体的大小是20个字节 struct Test { int Num; char *pcName; short sDate; char cha[2]; short sBa[4]; }*p; //假设p 的值为0x100000。 如下表表达式的值分别为多少? int main() { printf("%p\n", p + 0x1); printf("%p\n", (unsigned long)p + 0x1); printf("%p\n", (unsigned int*)p + 0x1); return 0; }
- 解析:
printf("%p\n", p + 0x1); //此时p为结构体类型,+1,即是加上一个test结构体类型的大小,指针指向往后20字节的位置, //再转化成16进制,即是0x100014 printf("%p\n", (unsigned long)p + 0x1); //地址为无符号类型,强制转化为无符号长整型,指针指向往后1字节的位置(先将16进制转为10进制+1再转为16进制) printf("%p\n", (unsigned int*)p + 0x1); //转为int*类型,+1即指向往后4字节的位置 输出结果为: 0x100014 0x100001 0x100004
- 笔试题3
int main() { int a[4] = { 1, 2, 3, 4 }; int *ptr1 = (int *)(&a + 1); int *ptr2 = (int *)((int)a + 1); printf( "%x,%x", ptr1[-1], *ptr2); return 0; }
- 解析:
int a[4] = { 1, 2, 3, 4 }; int *ptr1 = (int *)(&a + 1); //指向后一个数组空间,转为int*类型 int *ptr2 = (int *)((int)a + 1); //首元素地址先转为整型再+1,同上一题目,意思是指针指向往后1字节的位置,再转为int*类型 printf( "%x,%x", ptr1[-1], *ptr2); //ptr1[-1]表示数组第四个元素,对于*ptr2涉及大小端的问题 输出结果:4,2000000
当取出来时:02 00 00 00 (即是2000000)
- 笔试题4
#include <stdio.h> int main() { int a[3][2] = { (0, 1), (2, 3), (4, 5) }; int *p; p = a[0]; printf( "%d", p[0]); return 0; }
- 解析:
int a[3][2] = { (0, 1), (2, 3), (4, 5) }; //注意这里是逗号表达式,最后表达式为结果 int *p; p = a[0]; //p指向二维数组第一行 printf( "%d", p[0]); //p[0]表示一维数组第一个元素 输出结果:1
- 笔试题5
int main() { int a[5][5]; int(*p)[4]; p = a; printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]); return 0; }
- 解析:
int a[5][5]; int(*p)[4]; //p为指针指向int类型元素的数组类型是int(*)[4] p = a; //类型不同会警告,但可以编译过 printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]); //指针作差为相差元素个数 输出结果:FFFFFFFC(-4转为16进制),-4
- 笔试题6
int main() { int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int *ptr1 = (int *)(&aa + 1); int *ptr2 = (int *)(*(aa + 1)); printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1)); return 0; }
- 解析:
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)); //*(aa + 1)为二维数组第二行地址,指针转为int*类型 printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1)); 输出结果:10,5
- 笔试题7
#include <stdio.h> int main() { char *a[] = {"work","at","alibaba"}; char**pa = a; pa++; printf("%s\n", *pa); return 0; }
- 解析:
char *a[] = {"work","at","alibaba"}; //指针数组,指针指向字符串常变量,存储的是字符串首字符的地址 char**pa = a; //二级指针,指向数组首元素地址 pa++; printf("%s\n", *pa); 输出结果:at
- 笔试题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); printf("%s\n", *--*++cpp+3); printf("%s\n", *cpp[-2]+3); printf("%s\n", cpp[-1][-1]+1); return 0; }
- 解析:
char *c[] = {"ENTER","NEW","POINT","FIRST"}; char**cp[] = {c+3,c+2,c+1,c}; char***cpp = cp; printf("%s\n", **++cpp); //先++指向cp数组第二个元素,解引用为第二个元素内容,再解引用为"POINT"首字符地址 printf("%s\n", *--*++cpp+3);//注:++后cpp指向的对象已经改变 //此时cpp指向cp数组第二个元素,先++,指向cp数组第三个元素,解引用元素内容(c数组第二个元素地址) //再--为c数组第一个元素地址,再解引用为"ENTER"首元素地址,+3为E的地址 printf("%s\n", *cpp[-2]+3); //此时cpp指向cp数组第三个元素,cpp[-2]为cp数组第一个元素,解引用为c数组第四个元素(F的地址) //+3为S的地址 printf("%s\n", cpp[-1][-1]+1); //此时cpp指向cp数组第三个元素,cpp[-1][-1]表示c数组第二个元素,+1为O的地址
- 输出结果: