c语言解惑 ----读书笔记

2023-11-18

前言

面试过程中,发现自己确实对于c和c++实现的原理了解得不够深入,因此借书以解惑!

本书最大的亮点和可读点可以是对于指针部分和多文件工程时对文件内容的管理原则值得一读。

左值和右值

左值是一个具体的变量,右值一定是一个具体类型的值。所以有些可以既可以作为左值,也可以作为右值,但有些只能作为右值。

如 a[i] = b[i] , b[i] = a[i] 中,a[i]在两个式子中的含义是不一样的,在前者a[i]是一个变量,是数组中第i+1个元素的变量名 ; 后者的话 a[i] 是数组中第i+1个元素的值。

首地址

使用& 获得的是变量的首地址,指针存在的是地址,长度为地址的长度,不随指向变量类型的变化而变化。如虽然void 类型的指针可以指向任何类型的变量,但是不能使用*引用指向的值,要引用这个值,必须强制将void指针赋值给与值相应的指针类型。(因为得到的只是一个首地址,我们需要得到一个变量的值,还需要通过变量类型知道变量所占的内存空间大小)

同时,指针变量的值为一个地址值,但是这个地址不一定是有效地址(CPU中内存的地址)。当赋给一个无效的地址时,就不能使用*操作。

没有初始化指针和空指针

指针在没有初始化之前,指针变量没有存储有效地址,如果对其进行*操作就会产生运行时错误。当用NULL 初始化指针时,指针变量存储的内容是0号地址单元,这虽然是有效的地址,但也不允许使用 *操作,因为这次系统地址,不允许应用程序访问。但这个区域可以为程序提供判别条件。

指针的初始化

保证指针指向一个有效的地址,①保证指向一个地址;②指向的地址有效。

小段存储和大端存储

在这里插入图片描述
p1 = p2 ,则不仅使得p1和p2 都指向原本p2指向的地址,而且保证*p1 = *p2

数组

  1. 在c语言中对数组的下标变量的值是不进行合法性检查的,所以允许数组的下标越界。
  2. 数组名就是指针常量。

函数

  1. 编译系统只检查调用函数的类型是否与声明的一致,所以声明时不需要给出参数的变量名称。
  2. 形参。在函数未被调用时,系统不给形参分配存储单元。在函数被调用时,系统立刻给形参分配内存单元;调用结束后,再释放形参所占用的内存单元。
  3. 传递地址值得时候,系统不会为形参分配新的地址,而是为指针变量分配地址。也就是变量的值是指向实参的存储地址。所以没有复制值的过程。

文件结构

  1. 单文件: 预处理部分,主函数体,其他函数定义
  2. 一个源文件 + 一个头文件:头文件是用来编写预处理命令、函数原型声明及全局变量声明或定义; 源文件则是包含头文件、编写相应主程序和函数
  3. 单文件变量的存储地址分配:①全局区(静态区)是存放全局变量和静态变量的存放区域,分为已初始化和未初始化两个区域;②堆区一般由程序员分配和释放。如果程序员没有释放,则在程序结束后,由操作系统收回;③栈由编译器自动分配和释放,存放函数的参数、局部变量等。

多文件结构

  1. 一般将所有的函数原型和外部变量的声明,以及常数的定义都放在一个头文件里,需要这些头文件的源文件,就可以将它们包含进去。

main 函数的整型返回值的作用是向系统返回一个状态码,这在复杂应用程序的过程间通信时会用到,不过它对单一的程序是没有什么意义的。

c语言函数参数的传递方式只有转值一种。它在传递地址值得时候,传递的是值不是地址,传递变量地址值是使用变量指针作为参数。 而c++是有传递地址方式的,使用变量引用作为参数。

不能使用临时数组名作为函数返回值。虽然使用指针将首地址返给主函数,但当函数调用结束后,数组就不存在了,当然这个地址的内容也就不可预测了,所以对这个地址的一系列操作也就无从谈起了。

词法分析中的贪心思想:每一个符号应该包含尽可能多的字符。也就是说,编译器将程序分解为符号的方法是从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,就再读入下一个字符并判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断。如 a—b 等价与a-- -b

多文件中的函数设计

  1. 无参数的宏作为常量,而带参数的宏则可以提供比函数调用更高的效率。但预处理只是进行简单的文本代替而不做语法检查,所以会存在一些问题。因此宏定义有许多不安全因素,所以对需要使用无参数宏的场合,建议尽量使用const代替宏定义。

头文件

以下原则:

  1. 头文件里只写不实际生成的代码和不导致实际分配存储的描述。例如可写函数原型,不写函数定义;可用extern 声明外部变量,但不定义变量;可用包含标准库头文件和其他头文件的预处理命令;可用包含枚举的声明。
  2. 可用包含各种公用宏定义,但尽量少用宏定义。
  3. 只用文件包含命令(#include)包含头文件,不用它包含程序文件。
  4. 通过头文件能解决在一个程序文件里定义,而在另一个程序文件里使用的信息传递问题。
  5. 因为一个程序文件可能包含多个头文件,由此可能引起同一个头文件的重复包含问题。对头文件使用预处理命令可以避免这一问题。

#ifndef _H_LENTER
#define _H_LENTER
头文件主体
#endif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言解惑 ----读书笔记 的相关文章

随机推荐

  • 2019ICPC上海Spanning Tree Removal构造题

    刚打完2021杭电多校6 有个构造 当时没有做 回头看了一波巨佬的博客学了一手 在这里记录一下 题目链接 链接 https ac nowcoder com acm contest 4370 D 来源 牛客网 spj 题目描述 Bob has
  • SpringBoot项目多数据源的数据库连接池的启动

    Maven部分配置
  • 03-信息收集

    信息搜集 全面了解系统 什么是信息收集 信息收集是指通过各种方式获取所需要的信息 信息收集是信息得以利用的第一步 也是关键的一步 信息收集工作的好坏 会影响整个渗透测试流程的进行 收集的信息越多后期可进行测试的目标就越多 信息收集包含资产收
  • python中items的作用_什么是python items函数?怎么使用它?

    这篇文章我们来学习一下关于python字典之中的python items函数的相关知识 items函数是什么意思 这个函数有什么作用都将会在接下来的文章之中得到解答 描述 Python 字典 Dictionary items 函数以列表返回
  • vue3 watch 监听多值以及深度监听用法

    1 监听单个值 引入 import watch from vue import useRouter from vue router export default setup const route useRouter 获取当前路由地址 wa
  • linux kernel file_open

    内核空间与用户空间 在vfs read和vfs write函数中 其参数buf指向的用户空间的内存地址 如果我们直接使用内核空间的指针 则会返回 EFALUT 这是因为使用的缓冲区超过了用户空间的地址范围 一般系统调用会要求你使用的缓冲区不
  • Qt VTK ITK安装与测试(三)ITK的安装与测试

    ITK的安装与测试 安装简介 本部分讲述使用cmake加VS2010编译 安装ITK库 基本步骤和VTK安装时相同 而后测试VTK与ITK的联合开发 VTK安装步骤 1 资源下载 资源下载网址 http www itk org ITK re
  • 【笔记】python中的for循环(遍历列表)、for循环中的一些缩进问题

    文章目录 一 for循环 遍历列表 在for循环中执行更多的操作 二 for循环中的一些缩进问题 一 for循环 遍历列表 我们经常需要遍历列表的所有元素 对每个元素执行相同的操作 这种情况下 我们就需要使用for循环 下面我们举几个栗子来
  • 专业CPU信息检测工具:CPU-Z

    今天小编为大家测试了一款轻量级的CPU处理器的测试工具 可以查看CPU的详细信息 以供各位同学们学习 一 简单介绍 CPU Z是一款非常流行的CPU检测软件 被广大用户所熟知 它是目前最受欢迎的CPU检测软件之一 除了Intel和AMD自带
  • SQLi-LABS Less-29到Less-31

    Less 29题目 Less 29的题目提到了WAF 看题目的意思应该是一个保护网站的东西 百度了一下 WAF就是Web Application Firewall 主要功能是拦截入侵尝试 比如SQL Injection XSS 路径遍历 窃
  • Java中insert()方法的使用

    insert 函数表示在字符串中插入字符串 StringBuffer insert int index String str 在Java中最常用instert方法的是这两个类型StringBuffer和StringBuilder 首先需要先
  • elementui的文件上传功能-.上传文件-带参数-手动

    elementui的文件上传功能 上传文件 带参数 手动
  • JS函数(二)基础 return 返回值

    创建函数 function 函数名 形参变量列表 函数体 return 返回值 return 1 什么是 返回 return语句将终止当前函数并返回当前函数的值 2 为什么要用 我们先来看一组代码
  • matlab矩阵(一)--如何控制矩阵中小数点的位数

    format 设置输出格式对浮点性变量 缺省为format short format并不影响matlab如何计算和存储变量的值 对浮点型变量的计算 即单精度或双精度 按合适的浮点精度进行 而不论变量是如何显示的 对整型变量采用整型数据 整型
  • 汤姆·克鲁斯 - 电影全集

    1 熄灯号 Taps 1981 导演 哈诺德 贝克编剧 Darryl Ponicsan Devery Freeman James Lineberger主演 乔治 C 斯科特 蒂莫西 赫顿 罗尼 考克斯 西恩 潘 汤姆 克鲁斯 伊万 汉德勒
  • HLS图像处理系列——在ZEDBoard搭建DDR图像处理通路

    ZYNQ芯片内包含一个丰富特性的基于双核ARM Cortex A9的处理子系统 Processing System PS 和Xilinx 28nm可编程逻辑 Programmable Logic PL PS除了核心外还包括片上存储器 外部存
  • 端口扫描程序nmap使用手册

    摘要 nmap是一个网络探测和安全扫描程序 系统管理者和个人可以使用这个软件扫描大型的网络 获取那台主机正在运行以及提供什么服务等信息 nmap支持很多扫描技术 例如 UDP TCP connect TCP SYN 半开扫描 ftp代理 b
  • [原创]Discuz!NT1.1高亮代码插件1.5稳定版!

    Discuz NT 1 1高亮代码插件FOR NET2 0 作者 winson 版本 1 5稳定版 支持网站 http bbs szblogs com 功能 为论坛增加高亮代码显示 类似cnblogs的形式 一 1 5版修复的问题 之前发布
  • cgi和fastcgi获取所有环境变量(C语言)

    参考 http blog chinaunix net uid 620765 id 2084386 html 还记得C语言main函数的完整声明吗 int main int argc char argv char envp 这个就是c语言中m
  • c语言解惑 ----读书笔记

    c语言解惑 前言 左值和右值 首地址 没有初始化指针和空指针 指针的初始化 小段存储和大端存储 数组 函数 文件结构 多文件结构 多文件中的函数设计 头文件 前言 面试过程中 发现自己确实对于c和c 实现的原理了解得不够深入 因此借书以解惑