C和指针的一些摘录

C和指针(POINTERS ON C)

第一章 快速上手

1.1 简介

1.1.1 空白和注释
  • 程序的空白:空行将程序的不同部分分隔开来;制表符(tab)用于缩进语句,更好地显示程序的结构等

  • C是一种自由格式的语言,并没有规则要求必须怎样书写语句

  • 注释:以符号/*开始,以符号*/,不能嵌套,告诉读者程序能做什么以及怎样做(ps:注释如果不正确,那还不如没有!

    // 从逻辑上删除一段C代码,一种更安全、更好的办法是使用 #if 指令
    #if 0
    	statements
    #enif
    
1.1.2 预处理指令
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define  MAX_COLS   20
#define  MAX_INPUT  1000

以上5行为预处理命令(preprocessor directives),由**预处理器(preprocessor)**解释。预处理器读入源代码,根据预处理指令对其进行修改,然后把修改过的源代码递交给编译器。

在上述例子程序中,预处理器用名叫stdio.h的库函数头文件的内容替换第一条#include指令语句,其结果就仿佛是stdio.h的内容被逐字写到源文件的那个位置。第四五条语句,预处理指令#defineMAX_COLSMAX_INPUT分别定义为20和1000,当这些个名字以后出现在源文件的任意地方时,都会被替换为对应的定义值。由于被定义为字面值常量,所以这些名字不能出现于有些普通变量可以出现的场合(比如赋值运算符左边)。

int  read_column_numbers(int columns[], int max);
void rearrange(char *output, const char *input, int n_columns, const int columns[]);

这些声明被称为函数原型(function protorype)——告诉编译器这些以后将在源文件中定义的函数的特征,当这些函数被调用时,编译器能对它们进行准确性检查。每个原型以一个类型名开头,表示函数返回值的类型;返回类型名后面的是函数的名字;后面小括号中是函数期望接受的参数。函数原型中参数的名字并非必需,给出参数名字的目的是提示它们的作用

rearrange函数接受四个参数,其中第一和第二个参数都是指针(pointer)——指定一个存储于计算机内存中的值的地址;第二和第四个参数被声明为const,这表示函数将不会修改函数调用者所传递的这两个参数;关键字void表示函数并不返回任何值

1.1.3 main函数
int main(void) {
    statements
    return 0;
}

每个C程序都必须有一个main函数,因为它是程序执行的起点。关键字int表示函数返回一个整型值,关键字void表示函数不接受任何参数(其实也可以接受参数,如这种形式:int main(int argc, char *argv[]))。

在C语言中,数组参数的以引用(reference)形式进行传递的,也就是地址调用,而标量常量则是按**值(value)**传递的。在函数中对标量参数的任何修改都会在函数返回时丢失

C语言并不存在“string”数据类型,但在整个语言中,存在一项约定:字符串就是一串以NUL(一个NUL字节是指字节模式为全0的字节,类似‘\0’这样的字符常量,并不存在预定义的符号NUL)字节结尾的字符。NUL是作为字符串终止符,它本身并不被看作是字符串的一部分。字符串常量(string literal)就是源程序中被双引号括起来的一串字符。

scanf函数:由于其实现原理,所有标量参数的前面必须加上一个“&”符号;使用所有格式吗(除了%c之外)时,输入值之前的空白(空格制表符换行符号等)会被跳过,值后面的空白表示该值的结束。

标准并未硬性规定C编译器对数组下标有效性进行检查,而且绝大多数C编译器确实也不进行检查。因此,如果需要进行数组下标的有效性检查,必须自行编写

第二章 基本概念

2.1 环境

  • 翻译环境(translation environment) 源代码被转换为可执行的机器指令
  • 执行环境(execution environment) 用于实际执行代码

这两种环境不必位于同一台机器上。例如,交叉编译器(cross compiler)就是在一台机器上运行,但它所产生的可执行代码运行于不同类型的机器上。

2.1.1 翻译

翻译阶段由几个步骤组成:组成一个程序的每个(有可能多个)源文件通过编译过程分别转换为目标代码(object code);然后,各个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整可执行文件。链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它也可以搜索程序员个人的程序库,将其中需要使用的函数也链接到程序中。

compile and link process
compile process
link process
source code
object code
source code
compiler
source code
source code
object code
object code
object code
linker
libraries
executable
编译过程

编译过程本身由几个阶段组成:首先是预处理器(preprocessor)处理——预处理器主要在源代码上执行一些文本操作,如用实际值代替由#define指令定义的符号以及读入由#include指令包含的文件内容;然后,源代码经过解析(parse),判断语句的意思——这是产生绝大多数错误警告信息的地方;随后,产生目标代码——机器指令的初步形式,用于实现程序的语句。若在编译程序的命令行中加入了要求进行优化的选项,优化器(optimizer)就会对目标代码进一步进行处理,使它效率更高。但优化过程需要额外的时间,所以在程序调试完毕并准备生成正式产品之前一般不进行这个过程。

标准没有制定文件的取名规则,但通常C源代码保存于以.c扩展名命名的文件中,由#include指令包含到C源代码的文件被称为头文件,通常具有扩展名.h;至于目标文件名,不同环境可能具有不同约定,如在UNIX系统中,它们的扩展名是.o,在Microsoft系统中,它们的扩展名是.obj;用于编译和链接C程序的特定命令在不同的系统中各不相同,在绝大多数UNIX系统中,C编译器别称为cc

2.1.2 执行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值