小白是如何学习指针的(四)

即使世界线收束,未来是可以改变的

愿你我都能通过努力,获取自己想要的人生

上一篇博客我们已经学习了指针数组,接下来我们继续来学习几个指针类型。

1.字符指针变量

经过上面几篇博客的学习,我们很容易就可以知道字符指针变量就是存字符地址的变量,字符指针变量的创建以及初始化就不详细说了,这里我通过一个例子介绍一下使用时的注意事项。

按如图方式使用指针我们会发现程序什么也没打印,并且异常退出了。

而当我们将第三行代码注释后会发现程序正常运行并且我们成功修改了字符数组中的一个元素。这个现象当然会引起我们去思考原因。

我们需要了解一下计算机是如何存储数据的。如上图,计算机在分配内存时有不同的区块,每个区块都有不同的作用(当然不仅仅以上几个分块,只是我们在C编写程序的过程中大部分时间只涉及以上几个),我们可以看到,p1指针指向的内存在常量区(常量区的数据具有常性,不可被修改),因此我们进行的*p1='d'是一个非法操作(尝试对常量区代码进行修改),在不同的编译器下运行会有不同的结果(比如有些编译器会直接报错),而数组arr却不同,它是在栈上找一块内存存储字符串,我们可以对它进行修改。

根据上面的解释,我们对于这个例子也可以有很清楚的解释了,读者自行体会。

2.数组指针(不是指针数组!!)

数组指针,即指向数组的指针,存放的时数组的地址(注意它是指针)

这里我们也仅仅简单的介绍一下它的初始化和使用,重要的是对它的理解。

我们可以知道p的作用范围是整个数组,因此我们对它进行运算操作时跳过了整个数组。

再结合以往我们学过的知识,我们进一步强化对于指针的理解和使用,对于复杂的指针使用情况,理解它们最好的方法就是画图。

如图所示,我们可以很容易就可以把它们之间的关系弄清楚,并且对于指针的计算的过程以及结果我们都很清晰,本质上p4是一个二级指针,它指向的对象是一个一级指针,对一个二级指针做加减运算就要跳过一个int*(不同类型不同),而对一个一级指针做加减运算跳过一个整形,那么指针指向的位置和对象就很明白了。 

在前一篇博客中我讲述了一维数组传参的本质,接下来我们来看看二维数组传参的本质了。

我们对比这两个例子,发现他们的输出结果一模一样,上面的形参是一个完整的二位数组,而下面是一个指针数组,事实上这两种在本质上是一样的,因为arr数组名其实就是数组首元素的地址,我们通过调试可以验证

进入函数前

进入函数后

我们可以看到形参arr的值仍然和main函数中的arr的值相等,并且它的类型是一个指针数组,这些都可以验证arr数组名表示的是数组首元素地址,二维数组传参的本质就是传地址

3.函数指针变量

函数指针变量就是一个存放函数地址的变量

我们可以发现这些都有多种表现方式,这是在底层设计时的方案,我们只需知道有这些使用方法就可以。

4.typedef关键字

typedef是用来对类型重命名,使其简单化的关键字

如图使用方法,当然在我们日常学习中用的不多,但是如果你要继续往后学习(数据结构,c++等)或者是了解并实现(类似)底层将很有用。

结语:

我们现在将指针的类型学完了,刚开始学习指针时或许我们会混淆,但只要我们将指针类型弄清楚,再结合图形,对于大部分有关指针的程序分析都能弄清楚。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习C语言对于初学者来说,可以按照以下步骤来进行: 1. **理解基础知识**:开始之前,了解计算机基本概念如内存、数据类型、变量等。了解计算机是如何运作的以及C语言的基本结构是很重要的。 2. **选择教程或资源**:选择一本适合初学者的C语言教材,例如 "C Programming: A Modern Approach" 或者在线资源如C语言官方文档和Codecademy的教程。 3. **环境配置**:安装一个C编译器,比如GCC(GNU Compiler Collection),并学会使用文本编辑器(如Notepad++或Visual Studio Code)编写和运行C代码。 4. **语法入门**:从C语言的基础语法开始,比如变量声明、数据类型(如整型、浮点型、字符型)、运算符、控制结构(条件语句和循环)等。 5. **练习编写小程序**:通过编写简单的程序,如计算器、猜数字游戏等,来加深对语言的理解和实践。 6. **函数和数组**:学习函数的定义、调用以及数组的使用,这是C程序组织的关键。 7. **面向对象编程**:尽管C不是纯面向对象的语言,但理解指针和结构体,以及函数指针能让你接触到面向对象的元素。 8. **错误处理和输入输出**:学习如何处理程序中的错误,以及标准输入输出(如scanf和printf)的使用。 9. **阅读他人代码**:找一些开源项目来阅读,这有助于理解实际开发中C语言的应用。 10. **持续学习和实践**:编程是实践出真知,多做项目,不断调试和优化代码,逐渐提升编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值