C语言——指针进阶(一),C语言指针进阶详解(一)

马肤
摘要:本文将介绍C语言中指针的进阶知识。首先回顾了指针的基本概念,然后详细讲解了指针的运算、指针与数组的关系、指针与函数参数传递等知识点。通过本文的学习,读者可以更好地掌握指针的高级用法,提高编程效率和代码质量。本文旨在为C语言学习者提供指针进阶的入门指导。

目录

​编辑

一.字符指针

1.1 基本概念

 1.2 面试题

二.指针数组

三.数组指针

3.1 数组指针的定义

3.2 &数组名VS数组名

3.3 数组指针的使用

四.数组参数、指针参数

4.1 一维数组传参

​编辑

4.2 二维数组传参

4.3 一级指针传参

4.4 二级指针传参

​编辑

五.函数指针

六.结尾

C语言——指针进阶(一),C语言指针进阶详解(一) 第1张

一.字符指针

1.1 基本概念

C语言——指针进阶(一),C语言指针进阶详解(一) 第2张

我们可以打印试验一下字符串能否可以当成数组:

C语言——指针进阶(一),C语言指针进阶详解(一) 第3张

答案是可以,这样我们就学到的一种新的写法,可以直接把常量字符串存放到指针变量。

C语言——指针进阶(一),C语言指针进阶详解(一) 第4张

 不过这么做是有弊端的,就是不能修改,当我们尝试让指向首字符a的p进行解引用(修改首个字符变为‘e’)会发生错误。

C语言——指针进阶(一),C语言指针进阶详解(一) 第5张

所以我们可以在其前面添加const,这样就不会改变报错了。

const char* p = "abcdef"

C语言——指针进阶(一),C语言指针进阶详解(一) 第6张

p指向的是地址,地址不能用%c来打印出来,可以用%s,而*p因为是char*的指针类型,所以解引用后只能拿到一个字符,所以要用%c打印。

 1.2 面试题

C语言——指针进阶(一),C语言指针进阶详解(一) 第7张

我们可以发现s1与s2开辟了不同的空间指向了各自的地址。而const因为是常变量,所以当有多份的时候默认只有一份,这样s3和s4只能共同指向同一地址了,因为它是唯一的。

C语言——指针进阶(一),C语言指针进阶详解(一) 第8张

注意s3与s4存放的地址是一样,但是&s3和&s4可不一样,因为那是它们本身开辟用来存放地址的空间,空间地址是不一样的,只不过空间里面存放的地址(即内容)是一样的。

二.指针数组

C语言——指针进阶(一),C语言指针进阶详解(一) 第9张

 C语言——指针进阶(一),C语言指针进阶详解(一) 第10张

 C语言——指针进阶(一),C语言指针进阶详解(一) 第11张

C语言——指针进阶(一),C语言指针进阶详解(一) 第12张

 那我们接下来可以尝试通过下标来访问数组,再通过所访问数组的下标来访问其中的元素。

C语言——指针进阶(一),C语言指针进阶详解(一) 第13张

 C语言——指针进阶(一),C语言指针进阶详解(一) 第14张

C语言——指针进阶(一),C语言指针进阶详解(一) 第15张

三.数组指针

C语言——指针进阶(一),C语言指针进阶详解(一) 第16张

3.1 数组指针的定义

C语言——指针进阶(一),C语言指针进阶详解(一) 第17张

C语言——指针进阶(一),C语言指针进阶详解(一) 第18张 C语言——指针进阶(一),C语言指针进阶详解(一) 第19张

3.2 &数组名VS数组名

结果一样,但前2个是首个元素地址,&arr就不一定了。取arr地址用到int*,取&arr[0]用到int*,因为本质上是找到里面的元素,那么&arr又要用什么样的指针变量接收呢?C语言——指针进阶(一),C语言指针进阶详解(一) 第20张

C语言——指针进阶(一),C语言指针进阶详解(一) 第21张

3.3 数组指针的使用

C语言——指针进阶(一),C语言指针进阶详解(一) 第22张

 需要明确两点:1是确定好类型,2是标注大小。C语言——指针进阶(一),C语言指针进阶详解(一) 第23张

 我们会发现这么打印很别扭,C语言——指针进阶(一),C语言指针进阶详解(一) 第24张C语言——指针进阶(一),C语言指针进阶详解(一) 第25张

C语言——指针进阶(一),C语言指针进阶详解(一) 第26张

 这样还不如指针数组方便C语言——指针进阶(一),C语言指针进阶详解(一) 第27张

四.数组参数、指针参数

C语言——指针进阶(一),C语言指针进阶详解(一) 第28张

 C语言——指针进阶(一),C语言指针进阶详解(一) 第29张

4.1 一维数组传参

C语言——指针进阶(一),C语言指针进阶详解(一) 第30张

 //arr[i]-->*(arr+i)(首个元素的地址+i而不是整个元素地址+i)

C语言——指针进阶(一),C语言指针进阶详解(一) 第31张

4.2 二维数组传参

C语言——指针进阶(一),C语言指针进阶详解(一) 第32张

二维数组传参要用到数组指针,指向整个数组的地址,方便访问下一个数组地址中的元素。

p[i]-->*(p+i)解引用后实际就是数组名,后面就变成数组名[j],进行访问元素。

C语言——指针进阶(一),C语言指针进阶详解(一) 第33张

C语言——指针进阶(一),C语言指针进阶详解(一) 第34张

C语言——指针进阶(一),C语言指针进阶详解(一) 第35张

 C语言——指针进阶(一),C语言指针进阶详解(一) 第36张

4.3 一级指针传参

C语言——指针进阶(一),C语言指针进阶详解(一) 第37张

C语言——指针进阶(一),C语言指针进阶详解(一) 第38张

4.4 二级指针传参

C语言——指针进阶(一),C语言指针进阶详解(一) 第39张

五.函数指针

C语言——指针进阶(一),C语言指针进阶详解(一) 第40张

 C语言——指针进阶(一),C语言指针进阶详解(一) 第41张

 我们可以发现无论是&函数名还是函数名,都是同样的地址。C语言——指针进阶(一),C语言指针进阶详解(一) 第42张

函数指针的写法:

C语言——指针进阶(一),C语言指针进阶详解(一) 第43张

 切记*pf2要用括号括起来,不然就变成了一个返回类型是Int*的函数声明了。

C语言——指针进阶(一),C语言指针进阶详解(一) 第44张

 调用成功。

 分享一段有趣的代码:

C语言——指针进阶(一),C语言指针进阶详解(一) 第45张

 C语言——指针进阶(一),C语言指针进阶详解(一) 第46张

 C语言——指针进阶(一),C语言指针进阶详解(一) 第47张

 简化的版本:C语言——指针进阶(一),C语言指针进阶详解(一) 第48张

六.结尾

指针进阶确实很绕,这个过程要不断地去刨析它,追根溯源。不仅仅得时常记忆,还得多去用指针,这样后续遇到关于指针类型的难题才不会被难住。


0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码