当前位置: 首页 > news >正文

关于C语言本质的一些思考

最近自己在使用vscode+clangd读S5PV210开发板X210的内核代码以及驱动代码,自己对C语言的操纵有了一些思考,特此记录下来,可能没有逻辑性(非针对解决某一个问题)只是简单的记录自己的一些思考以及对c语言的加深认识,希望对大家有所帮助。

(1)为什么都说C语言是面向过程的语言,而Java或者Python这些语言是面向过程的语言呢?

我认为面向过程或者面向对象更倾向于编程思想,C语言中有大量面向对象的数据结构以及函数算法,但是我们不能说C语言是面向对象的语言。学习某种语言的关键就是对关键字的学习,C语言的关键字中没有任何一个是面向对象的,而Java和Python中有某些关键字例如class本身含义就带有面向对象的思想,如果利用这些关键字编写代码写出来的代码自然而言就是面向对象的了。所以总结说“某种编程语言是不是面向对象的语言,关键在于关键字”,而面向对象是一种编程思想,与语言是没有太多必然联系的。

(2)程序=数据结构+算法,这句话的理解。

程序是有数据+对应操纵函数构成的,数据是静态的,对应内存格子以及内存格子中的内容,是不会自己轻易发生变动的,如果想要变动数据的内容,就需要用的函数,在函数内部用过"赋值运算符="左值写操作,右值读操作完成。也就说要想读写数据,需要调用某一个函数,在该函数内部“{}”内部使用赋值运算符实现,函数就是一个动态过程,这里的动态指的是对数据的读写操作,这些读写操作是要放到某一个函数内部实现的。

(3)函数就是一个数据处理器,这句话的理解。

首先,数据我的理解是分为2种:常量和变量。常量就是程序中的宏值对应的数字以及字符串,还有就是容易忽略的地址值,因为无论什么类型的变量编译加载到内存中后对应的地址是不会变的,可以理解为变量名是唯一的,常量就只能去读它了,不能改变他。变量顾名思义就是可以改变的量,也可分为2类:普通变量和指针变量,普通变量容易理解就是int、float、struct、union、数组等定义的变量,指针变量较为特殊,这个变量存储的值是一个地址值,而且一般写入后(写入某个地址)就不会轻易再次进行写操作,这就是指针变量和真实变量的“绑定关系”(一旦绑定就不会轻易改变),因为如果再次写另外一个地址值后,就不能访问原先绑定的变量了。

(4)关于数据存在的意义。

我认为数据存在的意义在于对其读操作。数据首先要定义某一个变量,然后在写入有效数值,最后再去读它(读操作才是目的,变量的归途)。可能有些同事会想到寄存器,寄存器的确有时候无需程序读它,只需要写入有效数值。我们可以理解为寄存器在代码写入有效数值后,是硬件电路完成读操作。普通的变量如果只定义,那是没有任何意义的。同样的定义变量后,只是写入有效数值也没有意义的。数据真正的价值(或归途)就是写入有效数值后去读出来,然后根据根据里面的内容去直到接下来工作(例如赋值给另外一个变量,参与各种算术、逻辑运算,参与if switch分支语句、参与while for do-while循环语句等)。

(5)赋值运算符“=”

赋值运算符“=”在程序中无处不在,有些还是隐藏的,例如函数传参以及返回值返回。赋值运算符“=”的特点就是效率很高,但是无法处理复杂的数据结构(当然linux内核某些代码中也直接用结构体变量传参,以及赋值操作,编译器不报错,但是不常用,也不推荐)。赋值运算符的这种特点就决定了函数传参的时候为什么要使用对应指针变量了。因为指针变量占4字节,赋值运算符能够轻易完成赋值操作。而且有了指针变量就可以通过解引用“*”,“->”实现对数据本身或者结构体成员的访问。

(6)再谈指针变量

指针变量也是变量,要想有意义,也是需要先定义,然后写入某一个地址(与某个变量或者函数绑定,轻易不会在写),最后再通过指针变量解引用或者-》实现读操作。指针变量一般只会写一次,可以读好多次。通过指针变量用的最多的是读绑定的变量的内容或者结构体变量的内容,这就是输入型参数(指针变量),也可以通过指针变量去写绑定的变量或者变量成员,这就是输出型参数(输出型指针变量)。

http://www.lryc.cn/news/615099.html

相关文章:

  • Python(6) -- 数据容器
  • Python映射合并技术:多源数据集成的高级策略与工程实践
  • 3D感知多模态(图像、雷达感知)
  • 容器技术基础与实践:从镜像管理到自动运行配置全攻略
  • 大数据与财务管理:未来就业的黄金赛道
  • 深入理解C++构造函数与初始化列表
  • centos 怎么将一些命令设置为快捷命令
  • 当配置项只支持传入数字,即无法指定单位为rem,需要rem转px
  • 第六章:【springboot】框架springboot原理、springboot父子工程与Swagger
  • visual studio 字体设置
  • 动态路由菜单:根据用户角色动态生成菜单栏的实践(包含子菜单)
  • 【Python 语法糖小火锅 · 第 5 涮 · 完结】
  • java练习题:数字位数
  • 【Java基础】字符串不可变性、string的intern原理
  • C++11 ---- 线程库
  • 3.2Vue Router路由导航
  • B.10.01.3-性能优化实战:从JVM到数据库的全链路优化
  • 区块链密码学简介
  • (LeetCode 每日一题) 231. 2 的幂 (位运算)
  • 基于clodop和Chrome原生打印的标签实现方法与性能对比
  • 通过 SCP 和 LXD 配置迁移 CUDA 环境至共享(笔记)
  • 数据标准化与归一化的区别与应用场景
  • FAN5622SX 四通道六通道电流吸收线性LED驱动器,单线数字接口 数字式调光, 2.7 → 5.5 V 直流直流输入, 30mA输出FAN5622S
  • C++ unordered_map 和 unordered_set 的使用
  • 新手向:Python开发简易待办事项应用
  • 【JS-8-Json】深入理解JSON语法及Java中的JSON操作
  • Visual Studio Code (v1.103) 中 GitHub Copilot 最新更新!
  • [TryHackMe]Challenges---Game Zone游戏区
  • 避不开的数据拷贝(2)
  • 第二十天:数论度量