C语言学习笔记(必看知识点)_第1页
C语言学习笔记(必看知识点)_第2页
C语言学习笔记(必看知识点)_第3页
C语言学习笔记(必看知识点)_第4页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C 学习笔记-必看知识点100 例 ( 上 )-edited by lvlv from Nov. 8,2013 to Mar. 31,20141. define 和 ifndef 的用法答:取消宏定义undef条件编译预处理:#ifndef标识符# define标识符程序段1#else程序段2#endif它的作用是当“标识符没有由 # d e f i n e定义过。则编译 “ 程序段1”。否则编译“程序段2”。注意: 条件编译的作用是防止此头文件被多个文件调用,产生编译冲突,这里的表示符为当前头文件名的大写前加上_, 如果头文件名为err.h,则标示符为_ERR_H.2. extern关键字的

2、用法。extern 可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外, extern 也可用来进行链接指定。3. sizeof 的结果等于对象或者类型所占的内存字节数。4. snprintf()函数的用法。答:函数原型int snprintf(char *str, size_t size, const char *format, .);功能将可变个参数(.)按照format格式化成字符串,然后将其复制到str中。返回欲写入的字符串长度,若出错则返回负值。5.volatile(不稳定的,易变的)关键字答: volatile i

3、=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 ?答:英特尔集成众核(IntelMany IntegratedCore , MIC) 架构是英特尔公司现有产品(

4、 包括英特尔至强处理器在内) 的另一个关键补充。这种架构能在一颗芯片里面支持200 多个线程同时工作。MIC 众核协处理器Knight Corner,和之前上代Larrabee继承者Knights Ferry不同的是,新的Knights Corner从外表上看是采用与Xeon 类似的LGA/BGA 封装。从这点来看,集成50 个 x86 核心,运算能力达到1TFLOPS 的 Knights Corner可能会放弃 “加速卡 ”的形式,采用QPI 总线替代PCI-E 界面。7. C 语言中函数指针变量的详细介绍答:函数指针变量的作用:指向函数入口地址,用来调用函数。使用函数指针的好处在于,可以将

5、实现同一功能的多个模块统一起来标识,这样一来更容易后期的维护,系统结构更加清晰。或者归纳为:便于分层设计、利于系统抽象、降低耦合度以及使接口与实现分开。函数指针变量定义的一般形式为:类型说明符(*指针变量名)();其中"类型说明符"表示被指函数的返回值的类型。"(*指针变量名)"表示 "*"后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。例如申明函数指针变量:int (*pf)()或者char * (*pf)();后者表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是指针型,指向字符串。使用方法:i

6、nt max( int x, int y)pf= 函数名;(*pf)( int x, int y);头文件的说明答: conio.h不是C 标准库中的头文件,在C standardlibrary, ISO C和 POSIX 标准中均没有定义。conio是 ConsoleInput/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。大部分DOS ,Windows 3.x,Phar Lap ,DOSX , OS/2 orWin32 平台上的C 编译器提供此文件,UNIX 和 Linux平台的c

7、 编译器通常不包含此头文件。如果需要使用此头文件,可以从互联网下载。conio 库不仅适用于 Windows 平台, 在 Linux 下也可使用 . 网上已经有兼容包 , 下载后打开就可使用 ; 而至于 Mac 则完全跟 Windows 没有区别 , 直接可以使用 .9. +i和 i+ 的效率的比较。答:简单的比较前缀自增运算符和后缀自增运算符的效率是片面的,因为存在很多因素影响这个问题的答案。以现在的编译器的优化水平,在内建数据类型的情况下,效率没有区别。在自定义数据类型的情况下,+i的效率较高。10.C 语言中near 和 far关键字的作用?答: far 是和 near 对应的 , 就够

8、了 , 但是当代码比较庞大时个地址 , 指针的本质也是个地址就是一般程序的函数调用都在64k 地址范围内的, 就是16 位寻址,16位就可能不够了.far就代表32 位寻址 , 函数的本质就是, 所以就有了寻址的问题。11. 头文件中stdlib.h内容。答:stdlib.h里面定义了五种类型、一些宏和通用工具函数。类型例如size_t、wchar_t、div_t 、ldiv_t 和 lldiv_t ; 宏例如 EXIT_FAILURE 、EXIT_SUCCES 、SRAND_MA 和X MB_CUR_MAX 等等; 常用的函数如 malloc() 、calloc() 、realloc() 、

9、free() 、system() 、atoi() 、atol() 、 rand() 、 srand() 、 exit() 等等。12.#define只有宏名定义是什么意思!答 : 一般来说这样空的宏都是为了某些手段的,例如跨平台,比如说在windows 下我让a 赋值为10 ,在linux下要让a 赋值为20,那么就可以这么写#ifdef WINDOWSa = 10;#endif#ifdef LINUXa = 20;#endif;这样我只要在某个地方定义一个#define WINDOWS或者 #define LINUX就可以在跨平台的情况下采取不同的策略了.#undef是在后面取消以前定义的宏

10、定义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+ 就是靠这种机制来实现函

11、数重载的。20. 理解 C、 C+ 和 C #中变量生存期的区别!答: 应该从作用域的角度来区分变量的生存周期,生存周期分为三种:整个程序:修饰的关键字有static当前文件(.c 、 .cpp 、 .cs文件): 修饰的关键字有:C 语言: auto (自动变量), C+ 语言:private、 protected、 public等, C #中: private、 protected、 public、 partial等。当前程序段(if语句段、函数体等): 修饰的关键字有:同当前文件注:函数体外定义静态变量为全局静态变量,函数体内定义静态变量为局部静态变量,二者生存周期都是整个程序。且C 语

12、言中没有私有和公有之分,C+ 扩充了这一个功能。21. 引用和指针的区别?答:1. 从内存上来讲系统为指针分配内存空间,而引用与绑定的对象共享内存空间,系统不为引用变量分配内容空间。2 指针初始化以后可以改变指向的对象,而引用定义的时候必须要初始化,且初始化以后不允许再重新绑定对象。3. 所以引用访问对象是直接访问。指针访问对象是间接访问。4。如果pa 是指针,那么*pa 就是引用了。又如int a,&ra= a;那么 ra 就是 a 的 reference了。22. c答: h语言中头文件、库文件和头文件是编译时必须的,.clib文件的联系与区别。是链接时需要的,dll是运行时需要的

13、。附加依赖项的是.lib不是 .dll的编译和链接,有头文件和lib在开发和调试阶段,当然最好都有。,若生成了DLL, 则肯定也生成LIB文件。如果要完成源代码就够了。如果也使动态连接的程序运行起来,有 dll就够了。23.C 语言中编译链接的过程!答: obj 文件是目标文件,一般是程序编译后的二进制文件,在通过链接器和资源文件链接就成 exe 文件了。OBJ只给出了程序的相对地址,而EXE是绝对地址。OBJ文件不支持有孔的多边形面。24. 常见字符编码有:ASCII 编码 ( American Standard Code for Information Interchange)基本的ASC

14、II字符集共有 128 个字符,包括常用的字母、数字、标点符号等,一个字节来存放一个ASCII字符。BIG-5 码: 是通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码 ”。GB2312 编码:对 ASCII编码的扩充,收录简体中文和常用字符,通用于中国大陆。每个汉字占用两个字节。基本集共收入汉字6763 个和非汉字图形字符682 个。对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK 及 GB 18030汉字字符集的出现。GBK 编码 :对GB2312 的扩充,收录了繁体中文,简、繁体字融于一库,每个汉字占用两个字节。Unicode 编码:注意,Unicod

15、e 只是一个编码规范,目前实际实现的unicode 编码只要有三种: UTF-8,UCS-2和 UTF-16 。 Unicode 当然是一个很大的集合,现在的规模可以容纳100 多万个符号。Unicode 固然统一了编码方式,但是它的效率不高,比如UCS-4(Unicode 的标准之一 ) 规定用4 个字节存储一个符号,那么每个英文字母前都必然有三个字节是0 ,这对存储和传输来说都很耗资源。UTF-8 编码: UTF-8 是一种 8 位的 unicode字符集,编码长度是可变的,并且是ASCII 字符集的严格超集,也就是说ASCII 中每个字符的编码在UTF-8中 是完全一样的。UTF-8 字

16、符集中,一个字符可能是1 个字节, 2 个字节, 3 个字节或者4个字节长。一般来说,欧洲的字母字符长度为1 到 2个字节,而亚洲的大部分字符则是3个字节,附加字符为4 个字节长。UCS-2 编码:UCS-2 是固定长度为16 位的unicode字符集。每个字符都是2 个字节,UCS-2只支持unicode3.0,所以不支持附加字符。UCS-2 的优点:对于亚洲字符的存储空间需求比UTF-8 少,因为每个字符都是2 个字节。处理字符的速度比UTF-8 更快,因为是固定长度编码的。对于windows和 java的支持更好。UTF-16 编码:UTF-16 也是一种16 位编码的字符集。实际上,U

17、TF-16 就是UCS-2 加上附加字符的支持,也就是符合unicode4.0规范的UCS-2 。所以UTF-16 是 UCS-2 的严格超集。UTF-16 中的字符,要么是2 个字节,要么是4 个字节表示的。UTF-16 主要在windows2000以上版本使用。UTF-16 相对UTF-8 的优点,和UCS-2 是一致的。总结: 在亚洲进行在web 开发时,面向的是全球,使用UTF-8 编码是绝对没有错的,面向亚洲的话,使用 UCS-2 和 UTF 编码效率会更高。 综上所述,使用 UTF-8 编码绝对没有错,不会出现编码乱码的现象。25.Sql Sever中 char 、 varchar

18、、 nchar和 nvarchar的对比区别!答: ncahr和 nvarchar采用unicode编码,固定每个字符占用两个字节,char和 varchar固定每个字符采用一个字节。所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用 char/varchar我把他们的区别概括成:CHAR , NCHAR 定长,速度快,占空间大,需处理VARCHA ,R NVARCHA ,RTEXT 不定长,空间小,速度慢,无需处理。注意: 操作系统的语言环境支持中文可以使用char和 varchar,如果操作系统环境不支持中文,必须使用nvarchar和 ncahr 。请协

19、调好存储代价和兼容性之间的关系。26.MD5 利用 salt进行加密的过程程?用户输入【账号】和【密码】(以及其他用户信息);系统为用户生成【Salt 值】;系统将【 Salt 值】和【用户密码】连接到一起;对连接后的值进行散列,得到【Hash 值】;将【 Hash 值 1】和【 Salt 值】分别放到数据库中。用户登录时,用户输入【账号】和【密码】;系统通过用户名找到与之对应的【Hash 值】和【Salt 值】;系统将【 Salt 值】和【用户输入的密码】连接到一起;对连接后的值进行散列,得到【Hash 值 2】(注意是即时运算出来的值);比较【 Hash 值 1】和【 Hash 值 2】是

20、否相等,相等则表示密码正确,否则表示密码错误。有时候,为了减轻开发压力,程序员会统一使用一个salt 值(储存在某个地方),而不是每个用户都生成私有的salt 值。27.MD5 简介!答: Message DigestAlgorithmMD5 (中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数, 用以提供消息的完整性保护。 用于确保信息传输完整一致。机广泛使用的杂凑算法之一(又译摘要算法、哈希算法) ,主流编程语言普遍已有是计算MD5 实现算法原理:对为个MD5 算法简要的叙述可以为:MD5 以 512 位分组来处理输入的信息,且每一分组又被划分16 个 32 位子分组,经过

21、了一系列的处理后,算法的输出由四个32 位分组组成,将这四32 位分组级联后单目运算符28.C 语言中运算符的优先级别!30. alloca ,malloc、calloc和realloc的理解!答: alloca() 是分配在栈上,calloc()”是”分配内存给多个对象”,”配内存给一个对象”,”realloc()”是” 重新分配内存 ”之意。” free()malloc() ”是 ”分”就比较简单了, ”释放 ”的意思,就是把之前所分配的内存空间给释放出来。参数均为以字节为单位。注意: alloca 不具可移植性,而且在没有传统堆栈的机器上很难实现。当它的返回值直接传入另一个函数时会带来问

22、题,因为他分配在栈上。31.strstr(char *str1, char *str2)和 strchr(const char *s,char c)答:是分别求字符串和字符在前面字符串中第一次出现的地址的指针,返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串位置,的分别和用法!指针的内容就是地址,如果s中不存在c 则返回NULL 。32. strcpy和 memcpy 主要有以下3 方面的区别。1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串

23、结束符所以容易溢出。memcpy 则是根据其第3 个参数决定复制的长度。"0"才结束,3、用途不同。 通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy 。33. 函数指针的用法答:函数指针的定义:/申明函数指针pfint (*pf)(const int&, const int&);/ 具体函数intintCompare(constint& aInt,constint& bInt)可将函数指针pf 指向函数intComparepf = intCompare;调用:/使用pfif(pf(aInt, bInt) = 0

24、)cout <<"two integers are equal"<<"."<< endl;或者用pf 来申明其他的函数指针:/定义函数指针类型cmpFuntypedefint(*cmpFun)(cmpFun pf= intCompareconstint ;表示:&,pfconstint 指向函数&);intCompare();/ 函数名可以作为参数,申明形式是函数指针作为参数,其做法为intplusFun(int& aInt,int (*paf2)(constint&,constint&

25、amp;)intbInt = 1;intcInt = 2;returnaInt + paf2(bInt, cInt);函数指针作为返回值一个函数的返回值可以是一个函数指针,这个声明形式写起来有点麻烦:/ 函数指针作为返回值int(*retFunPointer(int)(constint&,constint&);上面的声明的含义:a)retFunPointer是一个函数,该函数有一个int类型的参数;b)retFunPointer返回值是一个函数指针,它指向的是带有两个const int&类型参数,且返回类型为int的函数。retFunPointer的定义:/函数指针为返

26、回值,整个函数名为retFunPointer,把自己装扮成函数指针,作为返回值。int(*retFunPointer(intaInt)(constint&,constint&)cout << aInt << endl;/ pf已经在前面定义过了returnpf;调用代码示例:/函数指针作为返回值,retFunPointer返回一个cmpFun 类型的函数指针cmpFun pf3 = retFunPointer(aaInt);intresult = pf3(aaInt, bbInt);cout << result << endl;3

27、4. 注意:答: C语言中,头文件中include的头文件内申明的函数,在当前.c文件中,是可以间接调用的!35. 注意答: C 语言中没有bool类型,用0 和 1 来表示真假!C 语言和 C+ 都是强类型的,变量在申明时候就要指定类型,而不是等编译器根据编译时候所赋的值来确定其便编译时的类型。36.MD5 算法原理简介!答:对MD5 算法简要的叙述可以为:MD5 以 512 位分组来处理输入的信息,且每一分组又被划分为16 个 32 位子分组,经过了一系列的处理后,算法的输出由四个32 位分组组成,将这四个32 位分组级联后将生成一个128 位散列值。也就是32 个十六进制的字符,每个字符

28、占 4 位从0 到 f ,均为小写,因此叫做128 位散列值。37. strncmp()函数简介答:用 法 : int strncmp(char *str1, char *str2, int maxlen);说明 : 此函数功能即比较字符串 str1 和 str2 的前 maxlen 个字符。如果前maxlen字节 完全相等, 返回值就 =0;在前 maxlen 字节比较过程中,如果出现 str1n与 str2n不等, 则返回( str1n-str2n) 1。38.<< 和 >> 和 >>> 这三个运算符号的理解答:<<( 左移 )运算规则

29、:按二进制形式把所有的数字向左移动对应的位数,高位移出( 舍弃)数学意义:在数字没有溢出的前提下,对于正数 和 负数 ,左移一位都相当于乘以位就相当于乘以2 的 n 次方。,低位的空位补零。2 的1 次方,左移n>>( 带符号右移)运算规则:按二进制形式把所有的数字向右移动对应的位数,低位移出( 舍弃 ) ,高位的空位补符号位,即正数补零,负数补1。数学意义:右移一位相当于除2,右移n 位相当于除以2 的 n 次方。这里是取商哈,余数 就不要了。>>>( 无符号右移)运算规则:按二进制形式把所有的数字向右移动对应位数,低位移出( 舍弃 ) ,高位的空位补零。对于正

30、数来说和带符号右移相同,对于负数来说不同。其他结构和>>相似。39.getch()函数和getchar()函数的区别答: getch():所在头文件:conio.h函数用途:从控制台读取一个字符,但不显示在屏幕上, 然后程序继续执行下去。getchar()函数:所在头文件时stdio.h函数用途: 用户按下字符后,等待用户按下回车,然后继续执行,且返回值显示在屏幕上。40. 注意strlen()函数求字符串长度的时候不会讲结尾符号0 算进去。substr() 函数是 C+ 中的函数, C 语言中没有这个函数,要想实现这个功能,可以使用 strncpy() 或者 memcpy 来实现

31、。41.strncpy()和 memcpy() 的区别答:二者都可指定长度来实现串的拷贝。不同点是当然有区别,strncpy()时拷贝字符串,memcpy() 是拷贝内存内容,可以拷贝其他类型的数据。42.sizeof()函数答: sizeof是运算符,可用于任何变量名、类型名或常量值,当用于变量名(不是数组名)或常量时,它不需要用圆括号。它在编译时起作用,而不是运行时。sizeof的结果等于对象或者类型所占的内存字节数, 包括字符串的结尾符0,strlen()求字符串的长度不包括结尾符0 。43.memet()函数,解决内存内存空间出现屯屯屯屯屯屯和烫烫烫烫烫烫乱码答: void *mems

32、et(void *s, char ch,size_tn);将 s 所指向的某一块内存中的每个字节 的内容全部设置为ch 指定的ASCII 值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向S 的指针。其中 void*s 空指针,指针不指向任何地址空间。初始化内存地址空间后就会解决乱码问题,用 memset(s,NULL,sizeof(s).乱码问题是因为使用malloc()申请的内存空间没有初始化,默认赋值0xcc ,打印出来就是屯屯屯,malloc申请的空间是在" 堆 " 上的,可手动释放。使用 alloca()申请内存会产生烫烫烫烫烫

33、烫,与malloc,calloc,realloc类似,但是注意一个重要的区别,_alloca是在栈 (stack)上申请空间, 用完马上就释放,无需手动释放。44. c语言中定义变量不赋初值默认是多少?答: C 语言中 , 没有加 static 默认为 auto 果加了 static, 不给初值的变量的初值是默认是只是它不代表任何地址。型此时不给初值的变量的初值是随机的0,指针也是一样,其实NULL, 但是的值就是如0 ,45.C 语言从源码到可执行程序的四个过程答:预处理 ( 也称预编译, Preprocessing):C 语言的预处理主要有三个方面的内容:1.宏定义;2. 文件包含;3.条

34、件编译。预处理命令以符号 “ #”开头,这个方面本质是将需要的代码包含到当前的.c文件中。编译 (Compilation):编译所做的工作就是词法分析,语法分析,在进行汇编成中间代码,汇编代码。汇编 (Assembly):汇编实际上指把汇编语言代码翻译成目标机器指令的过程。经过这一处理而得到相应的目标文件。目标文件中所存放的也就是与源程序等效的目标的机器语言代码。目标文件由段组成。通常一个目标文件中至少有两个段:代码段:该段中所包含的主要是程序的指令。该段一般是可读和可执行的,但一般却不可写。数据段:主要存放程序中要用到的各种全局变量或静态的数据。一般数据段都是可读,可写,可执行的。链接 (L

35、inking):链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶操作系统装入执行的统一整体。链接过程分为静态链接和动态链接。静态链接是指连接程序从静态链接库中拷贝需要的代码到被执行的程序中,动态链接是指代码被放到称作是动态链接库或共享对象的某个目标文件中,链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。 在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。46.G

36、CC 编译器编译的过程答:实质上, GCC 的编译过程是分为四个阶段进行的,即预处理编译 (Compilation)、汇编(Assembly)和连接(Linking)。(也称预编译,Preprocessing)、一步到位编译:gcc test.c -o test.out输出可执行文件test.out预处理:gcc -E test.c -o test.i或gcc -E test.c编译为汇编代码(Compilation): gcc -S test.i -o test.s汇编 (Assembly): gcc -c test.s -o test.o,编译成目标文件test.o。连接 (Linking

37、): gcc test.o -o test.out47. C 语言程序调试的常见错误分析与解决办法答: C 语言程序的编译是以.c 文件为单位进行编译的,生成.obj二进制目标文件,最后在链接成可执行文件。编译提示的错误:编译的时候进行词法分析和语法分析,此时书写不符合语法规则或者未定义会进行报错,这种错误容易处理。链接提示的错误: 经常会出现某函数已经在 main.obj 预处理的条件编译就发挥作用了, 可以防止重复编译。文件中定义,出现重复编译。这时候但是, 作用只能是防止变量的申明的重复编译,而不能防止变量的定义的重复编译。也就是说,在头文件中定义了函数之后,在不同的 .c 文件引入头文

38、件中,两个.c文件生成的obj文件中都会含有对函数体代码的目标代码。原因是, 我个人理解是, 条件编译之所以对头文件中定义的函数不能起到防止重复编译的功能,是因为函数体的实现代码编译后最终是要存入obj目标文件中的,编译是以 .c文件为单位的,每个.c 文件都会被编译成.obj文件,但是 .h文件中不能编译成obj文件,因此其函数的定义部分,即实现部分一定要编译成目标代码存入 obj文件,供链接时使用。但是当两个 .c 文件同时引用头文件时,两个.c 文件都可包含函数实现部分的代码的目标代码,编译器没有规定将函数代码的目标代码存入哪个.c 文件,只能两个同时包含,这就导致了链接时出现的重复定义

39、的问题。解决的办法就是不要在头文件中定义变量,只能申明。或者只能让一个 .c 文件引用含有定义变量的头文件,或者用static来修饰函数,定义为全局静态类型函数,这样的话函数代码就会被存到全局/ 静态存储区,编译时只会被编译一次,若非 static静态全局变量,函数被包含进.c文件后,就变成了当前.c 文件的全局变量,而不是整个程序的全局变量,这就导致了每个.c文件把它当做自己的函数来进行编译,将目标代码存入自己的obj 文件中,链接时就会出错。48.C/C+ 语言中程序在内存中的分区情况答:在 C+ 中,内存分成 5 个区,他们分别是堆、栈、自由存储区、全局 / 静态存储区和常量存储区。栈区

40、 ,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。堆区 ,就是那些由 new 分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete 。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。程序代码区 存放函数体的二进制代码。全局 / 静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C 语言中,全局变量又分为初始化的和未初始化的,在C+ 里面没有这个区分了,他们共同占用同一块内存区。常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改50.C

41、语言中sizeof()不能用来求指针指向的内存空间的大小答: *output=(char*)alloca(23*sizeof( char );sizeof(output);求得的不是指针output指向的内存的地址空间的大小,而是指针变量本身所占的内存空间大小,为 4 个字节。指针和数组是不一样的,但数组做为参数传递时就会退化为同类型的指针. str是数组拥有固定的内存sizeof是计算它占的字节数, 而指针只是一个存放变量地址的一个变量在任何时候都是占四个字节.51.C语言中不能用用strlen(),来求指针指向内存空间的长度,初始化后的指针字符串才可以答 : 因为strlen()函数是用来

42、计算字符串的长度,是以NULL 来表示的字符串结尾的标志,如果没有0 这个字符的话,strlen()统计出来的长度是不正确的。52. C 语言中函数的变参问题答: C 语言中输入和输出格式控制函数的参数实现不定的变化,是在C 语言中解决变参问题的一组宏,所在头文件:其实现的机理是因为VA_LIST#include <stdarg.h>。具体请参见百,度百科。53.8086/8088处理器中段的首地址,基址和偏移地址从哪获取答:物理地址段基址*16+ 偏移地址段的首地址就是段的基地址,等于段寄存器的内容*16 。段寄存器分为C S(代码段, Code Segment )、DS (数据

43、段, Data Segment)、SS(堆栈段,Stack Segment)和 ES (附加段数据,Extra Segment )寄存器。当进行读 / 写存储器操作数或者访问变量时,自动选择DS 或者 ES 寄存器作为段基址。DS 偏移地址对应SI( Source Index源变址寄存器)、 DI( Destination Index目的变址寄存器)CS 偏移地址对应IP(指针寄存器 )SS 偏移地址对应B(P基址指针寄存器Base Pointer)或 S(P 堆栈指针寄存器Stack Pointer )ES 偏移地址对应DI( Destination Index目的变址寄存器)53.C 语言中地址寻址与处理器的关系答: 8080 的地址线是16条, 8086/8088 的地址线有20 条, 80286 的地址

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论