C语言编程之道--读书笔记

C语言语法

const int nListNum =sizeof(aPrimeList)/sizeof(unsigned);//计算素数表里元素的个数 

1:#define INM_MAX 32767

#define 和#include一样,是预处理器编译指令,该编译器告诉预处理器,在程序中查找INT_MAX并将所有的INT_MAX替换为32767。#define为C遗产,C++中一种更好的方式为用const关键字。

2.sizeof指出整个数组的长度,而strlen返回存于数组中字符串的长度。

3.每次取一行,get()保留换行符,getline()则丢弃换行符。

4.通过声明创建的数组,则在程序被编译时为其分配内存空间,不管程序是否使用数组,数组都在那里,占用了内存,编译时为数组分配内存为静态联编。而使用new创建数组,运行阶段需要数组,则创建之。若不需要,则不用创建。

5.char animal[20]=”bear”;

char *bird=”wren”;

Cout<<animal<<”and”<<bird<<endl;//displaybear and wren

6.程序的存储方式有三种,自动存储,静态存储,动态存储。

自动存储:在函数内部定义的常规变量使用自动存储空间,亦被称为自动变量。

静态存储:静态存储为整个程序执行期间都存在的存储方式,使变量成为静态存储方式有2种,一种为在函数外部定义它,另一种在声明时使用static关键字。

动态存储:new与delete运算符提供了一种比自动变量与静态变量更灵活的方法,它们管理一个内存池,这在C++中被成为自由存储空间或堆。

7.数组、结构、指针为C++三种复合数据类型。

8.文件尾条件:检测文件尾(EOF)很多系统支持键盘模拟文件尾操作,在UNIX中可于运行时按下Ctr+D来实现,而Windows命令提示符模式下,可以在任何位置按下Ctr+Z+ENTER来实现。Cin.fail()==false//检测EOF或wile(!cin.fail())或while(!cin.eof)或while(cin)

9.读取字符时intch=getchar();getchar();while(ch!=10)可以判断输出是否结束。而char ch=getchar();getchar();while(ch!=EOF)可以判断输入是否结束。

10.char a;while(cin>>a){cout<<a<<endl;}一种判断输入是否结束的最方便的一种方式

11.char a;while(scanf(“%c”,&a)!=EOF){cout<<a<<endl;}C语言判断输入是否结束

12.另外出判断输入是否结束外,还可以判断输入数据的范围,如while(cin>>a&&a!=’#’)……

13.类型别名:C++建立别名有两种方式,一种使用预处理器,另一种使用typedef关键字来创建别名。#define BYTE char  typedefchar byte//将byte作为char的别名

14.字符函数库:cctpye,C++由C继承了一个与字符相关的非常方便的软件包,它可以大大简化字符是否为字母或数字等的操作。Isalnum()数字,islapha()是否为字母,isaltrl()是否为控制字符。

15.为何需要函数原型?原型描述了函数至编译器的接口,即它将函数返回值及参数类型告诉编译器,亦可用来检查语法及语意,后者用来解释结果。

16.C++标准用argument来表示实参,用parameter来表示形参。

17.arr[i]=*(ar+i); &arr[i]==ar+I

18.文件输入输出

ofstream outFile

outFile.open(“carinfo.txt”);//加入carinfo.txt并不存在的话,在该情况下,方法open()将新建一个名为carinfo.txt的文件。

outFile.close();

19.outFile可以使用cout的任何方法

inFile.open(“bowling.txt”);

if(!inFile.is_open()){exit(EXIT_FAILURE);}

 

inFile>>value;

while(inFile.good())

{

         ++count;setment+=value;inFile>>value;

}

If(inFile.eof())

20.函数指针

与函数类似,函数亦有地址,函数的地址为存储其机器语言代码的开始地址。

21.函数指针

double pam(int);

double *pf(int);

pam=pf;

22.头文件

头文件常包含的内容有如下几种内容:

1,函数原型

2.使用#define或const定义的符号常量

3.结构声明

4.类声明

5.模板声明

6.内联函数

23.最重要的OOP特性

抽象、封装与数据隐藏、多态、继承、代码的可重用性

为实现它们并将其组合至一起,C++提供了最重要的改进是提供了类

总之,采用OOP方法时,首先采用由用户出发的角度来考虑对象—抽象对象所需要的数据,以及描述用户与数据交互所需操作,完成接口描述后,需确定如何实现接口和数据存储。最后,使用新的设计方案创建出程序。

24.类规范由两部分组成

--类声明:以数据成员方式描述数据部分,以成员函数(方法)的方式描述公共接口

--类方法定义:描述如何实现成员函数

简单来讲,类声明提供了类蓝图,而方法定义提供了细节。

25.什么是接口

接口是一个共享框架,供两个系统(如计算机和打印机之间或用户和计算机程序之间)交互时使用。例如,用户可能是你,而程序可能是字处理器,使用字处理器时,你不可将脑子中想到的传到计算机内存中,而必须同程序提供的接口交互。程序接口将你的意图转换为存储于计算机中的具体信息。

对于类我们讲公共接口,在这里,公共是使用类的程序,交互系统由类对象组成;而接口由编写类的人提供的方法组成。接口让程序员可编写与类交互的代码,从而让程序员可以使用类对象。

若希望更人性化,不要将使用类的程序视为公共用户,而将编写程序的人视为公共用户。然而,要使用某个类,必须了解某公共接口;要编写类,必创建公共接口。

为开发一个类并编写一个使用它的程序需要完成多个步骤。这里讲开发过程分为多个阶段,而非一次性生成,通常C++程序员将接口置于头文件中,并将实现(类方法代码)放在源文件中,这是采用典型做法。

使用类对象的程序均可以直接访问共有部分,但只可以通过共有成员函数来访问对象的私有成员。公有成员函数为程序和对象私有成员间的接口,提供了对象与程序间接口。防止程序直接访问数据被称为数据隐藏,通过public,private,protected来实现数据隐藏。

类设计尽可能将公有接口与实现相分开,公有接口表示设计抽象组件,将实现细节放在一起并将它们与抽象分开被称为封装。1.数据隐藏:将数据放在类私有部分是一种封装。2.将实现细节隐藏于私有部分中,如stock类,set_lot所做一样,亦为一种封装3.将函数与类声明置于不同文件中,亦为一种封装。

26.C++包含了许多专门用来实现OOP方法的特性,因此它将程序员更进一步。首先,将数据表示和函数原型放在一个类声明中(而不是置于一个文件中),通过将所有的内容放在一个声明中,来使描述称为一个整体。其次,将数据表示为私有,使得数据只得被授予函数访问。在C语言的例子里,若main()直接访问了结构成员,则违反了OOP精神,但没有违反C语言规则。

27.类描述看上去包含了成员函数以及public和private可见标签的结构声明,实际上C++对结构进行了扩展,使之具有与类相同的特性,它们之间的唯一区别为,结构默认访问类型为public,而类为private,C++通常使用类来实现类描述,而结构限制为表示纯粹的数据对象(常被称为普通式数据,即Plain Old Data POD)。

28.动态分配C用malloc,C++用new动态分配的内存空间,不要忘记用free和delete来释放掉。

29.字符串结束符

C语言为了判定字符串是否结束,尾部加一个结尾标记’\0’,系统据此标记来判断字符串是否结束。合并字符串串的时候有必要考虑一下结束符,否则存储时会超出内存边界,引起内存异常。

30.数组长度及使用变量

一般数组长度应使用整型常量,避免数组长度前后不一。

31.比较字符串

用if(strcmp(str1,str2)==0)printf(“Yes”);

32.fgetc()

File *fp;

Char ch;

While((ch=fgetc(fp))!=EOF&&ch!=’\n’)

         Count++;

33.&,|,~和&&,||,!的区别

按位运算符(&,|,~)操作数被默认为是一个二进制数位序列,分别对其中每位进行操作。

而逻辑运算符(&&,||,!)将操作数当成非真即假,非假即真。

34.清屏

System(“cls”);

35.*p++,*(p++)是等价的

36.const和#define并非完全一样

在使用时尽量使用const声明常量,而不使用#define声明常量,即使用const常量完全取代宏常量。

37.malloc分配的内存块指针通常被看做一个真正的数组。

 

C语言基础知识细节

1.      const

a.      免去了被修改的烦恼。

b.      大多数编译器不给const变量分配存储空间,而将其保存于符号表中,不需要读写内存的操作。

Const限定对象通常于运行时不可被赋值对象,因此用const限定对象值并非一个真正的常量,不可用作数组的维度。如const int n =10;int a[n];是不对的

2,.volatile

限定词volitile修饰变量为随时可变的,volatile使用语法和const一样,其定义形式如:volatile int num=5;volatile经常在多线程的环境下,用于多线程修改变量前的同步。

4.不应该在头文件中定义变量,因为头文件可能被一个程序的多个源文件所有。

5.static

下次调用该函数的时候变量中的值是上一次调用该函数结束时变量的值。

 

 

C语言重点

1.      判断数组中元素的个数

int a[]={1,2,3,4,5};

int n=sizeof(a)/sizeof(a[0]);

2.’\0’和”\0”的区别

字符串即一串字符集合在一起,用字符数组来存储的一组字符,这是字符数组并非为字符串

‘\0’为ASCII码中值为0的字符,是一个空操作的字符,不是显示字符,不进行任何操作,只作为一个标记。

“\0”是C语言中存放字符串的结尾标志,占用1B的内存空间。

4.静态全局变量和全局变量

5.空指针

空指针不指向任何地方,不是任何变量或函数的地址,&地址操作符永远不会返回空指针。空指针不等同于未初始化的指针,未初始化的指针可以指向任何地方,空指针不指向任何地方。

6.if(p)可用来检查指针是否为空

7.const定义指针变量

Char * const p  常量为指针,且不可修改

Char const *p 指向常量的指针,常量不可修改

Const char *p 指向常量的指针,且常量不可修改

8.char a[],char *p

char []和char *a并不相同,a是一个常量,指向数组首地址,可以cout<<a[i];但不可以a++;而p是一个变量,可以指向任何位置或者哪里也不指向。

9.指针运算符与取地址运算符的联系

指针运算符*表示指向,表示指针变量与它所指向的变量之间的关系。

 

 

C语言高级技术细节

1.      定义一个结构体变量时,对成员类型并无限制,可以为任何基本的数据类型,可以是数组、联合体或枚举类型的变量或者指向结构体的指针。

2.      成员预算符.和->的差异

指向结构体的运算符->与指向结构体变量的指针连用,表示指向结构体变量的指针的成员。

成员运算符.用在一般的结构体变量中表示结构体变量的成员。

3.      联合体与结构体的区别与联系

联合体作为一种特殊形式的结构体,其所有的成员共享一个存储空间,存储空间保存最新的成员值。

在结构体变量中,各个成员值均有自己的存储空间,一个结构体变量的总长度为各个变量的长度值和。

4.      enum用来定义常量的值和#define所达到的效果是一样的。

5.      .h文件

一般情况下将如下内容放置在.h文件中

--宏定义

--结构、联合、枚举声明

--typedef声明

--外部函数声明

--全局变量声明

6.宏定义问题

宏定义为预处理命令的一种,以#define开头,它提供了一种可以替代原代码字符串的机制。据宏定义中是否有参数可分为带参数宏定义和不带参数的宏定义。

6.      条件编译

当两端代码共存于一个文件,编译时可以选择其中的一部分,可以用以下两种方法实现:

在源代码中使用编译语句,然后在程序文件中定义宏的形式来选择需要编译的代码。

在源代码中使用条件编译语句,然后在编译的命令中加入宏定义命令来实现选择编译。

7.      C语言预处理功能

8.      C语言中包含如下几种预处理功能。

A. 宏定义:包含无参数宏定义和有参数宏定义

B. 文件包含:指一个源文件可将另一个源文件完全包含进来

C. 条件编译:对源程序中程序段进行有选择编译

9.      maloc与calloc区别

stdlib中包含malloc函数,作用为在内存中动态分一块size大小的内存空间,malloc会返回一个指针,该指针指向分配的内存空间。若出现错误,则指向NULL,malloc分配的内存块在堆中,使用完后需要使用free来释放掉

malloc(size_t,size);

calloc(size_t n+size_t,size);

malloc分内存块未被清零,而calloc分内存块是清了零的

10.  内存泄露

当定义了一个指针时应立即为该指针分配一个内存空间,这是为了防止野指针产生。当使用完后,应立即加以释放。

野指针为指向垃圾内存的指针,而非NULL指针。

A.     指针变量未初始化

B.     指针被删除后,未被置为NULL,被误认为为合法指针,

C.     指针操作超出了变量作用的范围,不易被发现。

11.  内存耗尽了怎办?

用return终止本函数或用exit(1)终止整个程序运行。

12.  常见内存管理错误

A. 内存分配,但未初始化

B. 释放内存,却继续引用其内容

C. 分内存,未保存指向的指针,无法使用

D. 内存读写越界

13.  标准文件与一般文件的区别

标准文件:系统自动分配缓冲区文件,如:标准输入输出文件,出错文件

打开和关闭文件操作与否是作为一般文件与标准文件的区别。

14.  C语言常用的库文件包括哪些?

C语言系统提供了丰富的系统文件称为库文件,C语言库文件分为两类:一类为扩展名为.h的文件,在头文件中包含了常量定义,类型定义,宏定义,函数原型等各种设置;另一种为函数库,包含了各种函数目标代码,供用户在程序中使用。

库文件在使用前需要包含该函数原型所在的.h文件。

Alloc.h//内存管理

Ctype.h//字符分类与转换

Math.h//

Process.h//spawn()和exec()

Stdio.h//标准输入输出

String.h//串操作与内存转换

Time.h//时间转换程序

18.为何文件打开后需及时关闭

文件打开:将文件由磁盘读取至内存

文件关闭:将内存缓冲区中的文件flush至磁盘中,又可以释放内存空间。

19.C语言的预处理功能

a.宏定义:包含无参函数和有参函数的定义

b.文件包含:指一个源文件可以将另一个源文件包含进来。

c.条件编译:对源程序段进行有选择编译。

20.使用宏定义注意事项

a.宏定义并非C语言语句,不需要在行末添加分号

b.书写宏定义时,若需读行,有些编译时需要添加续行符(\)

c.宏定义时,宏名和带参括号间不加空格,否则将空格看做宏体的一部分。

d.进行宏替换时,不应增加或减少东西,只是进行简单替换。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值