目录

1. 指针类型决定指针+ -的步长

2. 注意逗号表达式()与 { } 之间区别

3. 二维数组与指针

4. 字符指针


1. 指针类型决定指针+ -的步长

强制类型转换:类型转换,但是值不会改变;

 int a[5] = { 1, 2, 3, 4, 5 };int *ptr = (int *)(&a + 1);//强制类型转换:类型转换,但是值不会改变;printf( "%d,%d", *(a + 1), *(ptr - 1));//答案:2 5
 //已知,结构体Test类型的变量大小是20个字节p = (struct Test*)0x100000;//p就是结构体类型的指针printf("%p\n", p + 0x1);//这里指针类型是20(0x14)字节printf("%p\n", (unsigned long)p + 0x1);//这里把p转换成整数类型,整型+-1就是直接+-1,所以直接加 0x1printf("%p\n", (unsigned int*)p + 0x1);//这里指针类型是4(0x4)字节//答案:00100014/00100001/00100004
 int a[4] = { 1, 2, 3, 4 };int *ptr1 = (int *)(&a + 1);int *ptr2 = (int *)((int)a + 1);//***注意***:此时a为整型,那么a+1的值就是a+1printf( "%x,%x", ptr1[-1], *ptr2);// %x是以16进制输出整数;//注意:ptr1[-1]就是 *(ptr1 - 1)//下面给出a数组在内存中的存储(每个字节)//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00//a本来是地址指向01,+1之后(字节+1)指向01后面的00了//ptr2指向整个序列的第二个字节,且ptr2是整型指针类型,解引用后访问4个字节:00 00 00 02 (小端实际要反过来)= 0x2000000//答案: 4 2000000

2. 注意逗号表达式()与 { } 之间区别

 int a[3][2] = { (0, 1), (2, 3), (4, 5) };//注意,里面若是{}括号,那么就是正常解答//(,)是逗号表达式,实际上a[3][2]  = {1,3,5}int *p;p = a[0];//表示第一行首元素的地址printf( "%d\n", p[0]);//p[0] == *(p+0),p[0]表示a[0][0],第一行第一个元素//答案是1

3. 二维数组与指针

 int a[5][5] = {0};int(*p)[4];p = (int(*)[4])a;printf("%d\n",&p[4][2] - &a[4][2]);//-4  ***重要***:两个地址相减得到是中间元素的个数printf("%p\n",&p[4][2] - &a[4][2]);//fffffffc -4以%p的形式打印时,直接将补码以地址的形式读取;//以上a[4][2]容易获得//p[4][2]的获取,画出a[5][5]在内存中的存储//00000 00000 00000 00000 00000//p是int(*)[4]型指针,指向a[5][5]第一行第一个元素的地址;//p[4]相当于*(p+4),p向后指向了4*4个元素,也就是a[3][1]的位置//p[4][2] == (*(p+4))[2] == *((*(p+4))+2)//(p+4)是地址,*(p+4)解引用是数组名,且p解引用后*p应该是4个元素的数组,(p+4)也一样//所以(*(p+4))[2]向后指2个元素,也就是a[3][3]//a[3][3]和a[4][2]中间有4个元素;
 int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int *ptr1 = (int *)(&aa + 1);int *ptr2 = (int *)(*(aa + 1));//第二个int*其实可以不用//(aa+1)表示第二行(是一个一维数组)的地址,解引用*(aa+1)表示第二行的数组名,也表示第二行的首元素的地址//int *ptr2 = (*(aa + 1));//int *ptr2 = (int *)((aa + 1));printf( "%d,%d\n", *(ptr1 - 1), *(ptr2 - 1));//答案: 10 5

4. 字符指针

 char *a[] = {"work","at","alibaba"};//字符串数组char** pa = a;//a是数组名,pa指向首元素(字符指针)的地址pa++;//(pa+1) 指针向后移了一项;printf("%s\n", *pa);//at
 char *c[] = {"ENTER","NEW","POINT","FIRST"};char**cp[] = {c+3,c+2,c+1,c};char***cpp = cp;printf("%s\n", **++cpp);      //pointprintf("%s\n", *--*++cpp+3);  //erprintf("%s\n", *cpp[-2]+3);   //stprintf("%s\n", cpp[-1][-1]+1);//ew//讲解见笔记:画一下数组的内存分布再做题;//注意:++cpp会对cpp重新赋值,相当于cpp = (cpp+1)//而cpp[-2]等价于 *(cpp-2),不会cpp重新赋值

C语言指针相关——经典面试题相关推荐

  1. c语言指针面试经典选择题及答案,C语言指针经典练习题-及答案

    <C语言指针经典练习题-及答案>由会员分享,可在线阅读,更多相关<C语言指针经典练习题-及答案(11页珍藏版)>请在人人文库网上搜索. 1.C语言指针练习题及答案一.选择题1. ...

  2. Oracle数据库相关经典面试题

    金九银十的面试季节,最近我会多发一些面试题相关的文章,因为墨白也要开始找工作了大家一起加油哈 ! ! ! oracle下有自动增长类型的字段吗?若无,如何实现自增长的功能 ? 答∶ 没有,实现自增长需 ...

  3. Web网络协议相关经典面试题

    输入完网址按下回车, 刚看到网页的过程中发生了什么 域名解析 发起TCP的3次握手 建立TCP连接后发起http请求 服务器端响应http请求,浏览器得到html代码 浏览器解析html代码,并请求h ...

  4. 为各位学弟学妹整理的C语言/C++相关笔试面试题

    1 变量的声明和定义有什么区别 变量的定义为变量分配地址和存储空间, 变量的声明不分配地址.一个变量可以在多个地方声明, 但是只在一个地方定义.加入extern 修饰的是变量的声明,说明此变量将在文件 ...

  5. 【C语言】指针的经典且简单的案例分析

    提示:本文仅供C语言初学者参考使用,文章代码部分来源网络,如有侵权,请尽快私信删除! 文章目录 前言 一.幻方 二.找博主 三.用指针排序 总结 前言 提示:为加深对C语言中指针的理解,分析了几道C语 ...

  6. C语言——指针详细讲解

    目录 一.指针 二.字符指针 三.指针数组 四.数组指针 五.数组参数.指针参数 六.函数指针 七.函数指针数组 八 .指向函数指针数组的指针 九.回调函数 十.深度解析指针和数组 一.指针 (一). ...

  7. 【C语言经典面试题】这样的char * 定义怎么回事

    作者简介 *架构师李肯(全网同名)**,一个专注于嵌入式IoT领域的架构师.有着近10年的嵌入式一线开发经验,深耕IoT领域多年,熟知IoT领域的业务发展,深度掌握IoT领域的相关技术栈,包括但不限于 ...

  8. linux c语言常见面试题及答案,Linux下C语言的几道经典面试题小结(分享)

    Linux下C语言的几道经典面试题小结(分享) 本篇文章整理了几道Linux下C语言的经典面试题,相信对大家更好的理解Linux下的C语言会有很大的帮助,欢迎大家探讨指正. 1.如果在Linux下使用 ...

  9. c语言指针笔试面试题,c语言指针面试常见问题

    c语言指针面试常见问题 指针的使用,一直是c语言面试题中必考的部分,因为指针本身使用的复杂性与普适性,所以考点非常多,而且也可以与其他知识相互结合,因此我们将会使用五篇专题的篇幅来介绍指针. 分析下面 ...

最新文章

  1. MySQL学习笔记:MySQL管理
  2. JVM 内存管理、自带性能监测调优工具 (jstack、jstat)及 JVM GC 调优
  3. systemctl命令_开发者必备Linux命令
  4. FPGA原型验证、硬件加速器(emulater 模拟器)、和aws FPGA公有云区别
  5. PIL库实现图像手绘效果
  6. BGI-College生信入门系列——3、数据库
  7. NPL基于词典分词(三)
  8. 解决树莓派4B不能通过手机热点连上WiFi
  9. C++之单例(singleton)模式
  10. Mac如何输入特殊符号
  11. 惠普暗夜精灵2怎么打开后盖_散热为何如此优秀?HP暗影精灵II代拆解
  12. 2022年模式识别高峰论坛学习与个人感悟
  13. stm32简易示波器(标准库)
  14. Android模拟器优化加速
  15. Windows电脑开机蓝屏(2)
  16. ZYNQ PL中断PS
  17. 区块链开发工程师和人工智能算法工程师,哪个会在未来 5 年收入更高?
  18. bzoj 3036: 绿豆蛙的归宿
  19. 敏捷对商业意味着什么_敏捷神话6:“敏捷意味着没有前期设计”
  20. 余光中老爷爷走好!!!

热门文章

  1. 基于BIM的施工安全管理方法有哪些?
  2. Python实现冒泡排序的代码
  3. 由于Rambler Group的诉讼,正在搜寻Nginx的办公室。 投诉人新闻服务确认诉讼
  4. 认识区块链,认知区块链——NFT
  5. EF BB BF 文本文件开头 iniparser
  6. 你想跨互联网远程调试Android设备吗,推荐一个远程控制手机的免费软件
  7. python爬虫怎么爬小说_Python 新手] 爬虫练习:爬取起点中文网的小说排行并存入 excel 表格中...
  8. 浪潮cs5280H raid方案详细
  9. 【SLAM编译错误】CMakeFiles/Makefile2:252: recipe for target 'CMakeFiles/stereo_kitti.dir/all' failed
  10. html页面解析 成dom树,将网页解析成dom树的几种方法