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

关于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.xdnf.cn/news/17402.html

相关文章:

  • 计算BERT-BASE参数量
  • 驾驶场景玩手机识别准确率↑32%:陌讯动态特征融合算法实战解析
  • 数据结构——优先级队列(PriorityQueue):一文解决 Top K 问题!
  • 01数据结构-图的邻接矩阵和遍历
  • Java进阶之单列集合List接口下的通用方法
  • Serper注册无反应
  • spring的知识点:容器、AOP、事物
  • C语言中级_宏定义传参、volatile和extern关键字、字符串数组和字符串函数
  • Python Gradio 写的-文本情感分析小软件 (不用Html+css+js 可写出网页来)
  • Mac屏幕取色不准?探究原理和换算规则
  • STM32学习笔记6-TIM-2输出比较功能
  • PyQt5技术栈简述
  • SpringBoot日志关系
  • react之React.cloneElement()
  • 数据结构初阶(7)树 二叉树
  • Spring——Spring懒加载设计使用场景
  • try/catch/throw 简明指南
  • 零拷贝技术:提升传统I/O的性能
  • 理解协议最大传输单元(MTU)和TCP 最大报文段长度(MSS)
  • 【ros_humble】3.人脸检测python(服务通讯和参数通讯介绍)
  • jenkins-飞书通知机制
  • mac安装node.js
  • 前端懒加载技术全面解析
  • Yi大模型-零一万物发布的开源大模型
  • [FOC电机控制]霍尔传感器于角度问题
  • Docker容器部署Tomcat线上商城
  • golang的二维数组
  • AI工具在数据质量管理中的应用
  • windows10 ubuntu 24.04 双系统 安装教程
  • Ubuntu和Windows系统Kafka配置方法