给你一段代码,问程序的结果是什么?
1. #include<stdio.h> 2. int main() 3. { 4. int a[5] = { 1, 2, 3, 4, 5 }; 5. int* ptr = (int*)(&a + 1); 6. printf("%d,%d", *(a + 1), *(ptr - 1)); 7. return 0; 8. }
这道题比较简单,大家稍微思考一下应该就知道了,不理解的看下面哦!
知识点补充:
指针类型决定了指针向前或向后走一步的步长(±整数),单位是字节。详情请看我这一篇文章:
解题思路:
指针面试真题二
已知结构体大小是20字节,问下列表达式的值分别是多少?
1. #include<stdio.h> 2. struct Test 3. { 4. int Num; 5. char* pcName; 6. short sDate; 7. char cha[2]; 8. short sBa[4]; 9. }*p; 10. //假设p 的值为0x100000。 如下表表达式的值分别为多少? 11. //已知,结构体Test类型的变量大小是20个字节 12. int main() 13. { 14. printf("%p\n", p + 0x1); 15. printf("%p\n", (unsigned long)p + 0x1); 16. printf("%p\n", (unsigned int*)p + 0x1); 17. return 0; 18. }
解题思路:
指针面试真题三
在小端存储模式下,给出下面一段程序,问输出什么?(vs2019采用的小端存储)
1. #include<stdio.h> 2. 3. int main() 4. { 5. int a[4] = { 1, 2, 3, 4 }; 6. int* ptr1 = (int*)(&a + 1); 7. int* ptr2 = (int*)((int)a + 1); 8. printf("%x,%x", ptr1[-1], *ptr2); 9. return 0; 10. }
知识点补充
这里要补充大小端的概念:
大端字节序存储:当一个数据的低位放到高地址处,数据的高位放到低地址处;
小端字节序存储:当一个数据的低位放到低地址处,数据的高位放到高地址处.
(不了解大小端存储的博主后续会出相应的内容)
解题思路
指针面试真题四
这题不难,不过有小坑哦
1. #include <stdio.h> 2. int main() 3. { 4. int a[3][2] = { (0, 1), (2, 3), (4, 5) }; 5. int *p; 6. p = a[0]; 7. printf( "%d", p[0]); 8. return 0; 9. }
知识点补充
逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果,这里需要注意哦,每个表达式都会执行计算,只不过选用最后一个表达式的结果作为整个表达式的结果。了解更多,点击博主的这篇文章:对C语言操作符的再认识
解题思路
指针面试真题五
给出如下程序,问输出什么值?
1. #include<stdio.h> 2. int main() 3. { 4. int a[5][5]; 5. int(*p)[4]; 6. p = a; 7. printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]); 8. return 0; 9. }
知识点补充
指针-指针:
注意哦,使用指针-指针运算的时候,前提是两个指针指向的是同一块内存空间,那何为指向同一块内存空间呢?最典型的例子就是数组。
指针-指针其实表示的是两个指针中间的元素个数,注意哦,不是中间有几个字节。
指针面试真题六
很简单的一道题:
1. #include<stdio.h> 2. int main() 3. { 4. int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 5. int* ptr1 = (int*)(&aa + 1); 6. int* ptr2 = (int*)(*(aa + 1)); 7. printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1)); 8. return 0; 9. }
解题思路
指针面试真题七
这道题实际上是为下一题过度准备的。
1. #include <stdio.h> 2. int main() 3. { 4. char* a[] = { "work","at","alibaba" }; 5. char** pa = a; 6. pa++; 7. printf("%s\n", *pa); 8. return 0; 9. }
解题思路
指针面试真题八
注意哦,这道题算是这几道中难度最大的一道,但是有了前一题的思路,这道题也就不再那么难以理解。
1. #include<stdio.h> 2. int main() 3. { 4. char* c[] = { "ENTER","NEW","POINT","FIRST" }; 5. char** cp[] = { c + 3,c + 2,c + 1,c }; 6. char*** cpp = cp; 7. printf("%s\n", **++cpp); 8. printf("%s\n", *-- * ++cpp + 3); 9. printf("%s\n", *cpp[-2] + 3); 10. printf("%s\n", cpp[-1][-1] + 1); 11. return 0; 12. }
解题思路
一开始,在内存中是这么存储的: