C语言学习笔记(必看知识点)
- 格式:docx
- 大小:115.77 KB
- 文档页数:23
C学习笔记
--必看知识点100例(上)
--edited by lvlv from Nov. 8,2013 to Mar. 31,2014
1.define和ifndef的用法
答:取消宏定义undef
条件编译预处理:
#ifndef 标识符
# define 标识符
程序段 1
#else
程序段 2
#endif
它的作用是当“ 标识符没有由# d e f i n e定义过。则编译“程序段1”。否则编译“程序段2” 。
注意:条件编译的作用是防止此头文件被多个文件调用,产生编译冲突,这里的表示符为当前头文件名的大写前加上_,如果头文件名为err.h,则标示符为_ERR_H.
2. extern关键字的用法。
extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
另外,extern也可用来进行链接指定。
3.sizeof的结果等于对象或者类型所占的内存字节数。
4. snprintf()函数的用法。
答:函数原型int snprintf(char *str, size_t size, const char *format, ...);功能将可变个参数(...)按照format格式化成字符串,然后将其复制到str中。返回欲写入的字符串长度,若出错则返回负值。
5.volatile(不稳定的,易变的)关键字
答:volatile i=10;
k=i;
volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。
6.strtok函数的用法。
答:函数原型char *strtok(char s[], const char *delim);
例如:strtok("abc,def,ghi",","),最后可以分割成为abc def ghi.尤其在点分十进制的IP中提取应用较多。
7.MIC?
答:英特尔集成众核(Intel Many Integrated Core,MIC)架构是英特尔公司现有产品(包括英特尔至强处理器在内)的另一个关键补充。这种架构能在一颗芯片里面支持200多个线程同时工作。
MIC众核协处理器Knight Corner,和之前上代Larrabee继承者Knights Ferry不同的是,新的Knights Corner从外表上看是采用与Xeon类似的LGA/BGA封装。从这点来看,集成50个x86核心,运算能力达到1TFLOPS的Knights Corner可能会放弃“加速卡”的形式,采用QPI总线替代PCI-E界面。
7.C语言中函数指针变量的详细介绍
答:
函数指针变量的作用:指向函数入口地址,用来调用函数。
使用函数指针的好处在于,可以将实现同一功能的多个模块统一起来标识,这样一来更容易后期的维护,系统结构更加清晰。或者归纳为:便于分层设计、利于系统抽象、降低耦合度以及使接口与实现分开。
函数指针变量定义的一般形式为:
类型说明符 (* 指针变量名 )();
其中 " 类型说明符 " 表示被指函数的返回值的类型。 "(* 指针变量名 )" 表示 "*" 后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。
例如申明函数指针变量:int (*pf)()或者char * (*pf)();
后者表示 pf 是一个指向函数入口的指针变量,该函数的返回值 ( 函数值 ) 是指针型,指向字符串。
使用方法:int max(int x,int y)
pf=函数名;
(*pf)(int x,int y);
8.conio.h头文件的说明
答:conio.h不是C标准库中的头文件,在C standard library,ISO C 和POSIX标准中均没有定义。conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
大部分DOS,Windows 3.x,Phar Lap,DOSX,OS/2 or Win32平台上的C编译器提供此文件,UNIX 和Linux平台的c编译器通常不包含此头文件。
如果需要使用此头文件,可以从互联网下载。
conio库不仅适用于 Windows 平台,在 Linux 下也可使用.网上已经有兼容包,下载后打开就可使用;而至于 Mac 则完全跟 Windows 没有区别,直接可以使用.
9. ++i和i++的效率的比较。
答:简单的比较前缀自增运算符和后缀自增运算符的效率是片面的,因为存在很多因素影响这个问题的答案。以现在的编译器的优化水平,
在内建数据类型的情况下,效率没有区别。在自定义数据类型的情况下,++i的效率较高。
10.C语言中near和far关键字的作用?
答:far是和near对应的,就是一般程序的函数调用都在64k地址范围内的,就是16位寻址就够了,但是当代码比较庞大时,16位就可能不够了.far就代表32位寻址,函数的本质就是个地址,指针的本质也是个地址,所以就有了寻址的问题。
11.头文件中stdlib.h内容。
答:stdlib.h里面定义了五种类型、一些宏和通用工具函数。类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX 等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。
12.#define只有宏名定义是什么意思!
答:一般来说这样空的宏都是为了某些手段的,例如跨平台,比如说在windows下我让a赋值为10,在linux下要让a赋值为20,那么就可以这么写
#ifdef WINDOWS
a = 10;
#endif
#ifdef LINUX
a = 20;
#endif;
这样我只要在某个地方定义一个#define WINDOWS或者#define LINUX就可以在跨平台的情况下采取不同的策略了.
#undef 是在后面取消以前定义的宏定义
18.extern “C”修饰符的理解!
答:被extern "C"修饰的变量和函数是按照C语言方式编译和连接的;
19.C++中增加函数重载的功能的内部原理!
答:C语言是不支持函数重载功能的,
void foo( int x, int y );
该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int 之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。
20.理解C、C++和C#中变量生存期的区别!
答:应该从作用域的角度来区分变量的生存周期,生存周期分为三种:
整个程序:修饰的关键字有static
当前文件(.c、.cpp、.cs文件):修饰的关键字有:C语言:auto(自动变量),C++语言:private、protected、public等,C#中:private、protected、public、partial等。
当前程序段(if语句段、函数体等):修饰的关键字有:同当前文件
注:函数体外定义静态变量为全局静态变量,函数体内定义静态变量为局部静态变量,二者生存周期都是整个程序。且C语言中没有私有和公有之分,C++扩充了这一个功能。
21.引用和指针的区别?