C语言学习笔记计算机基础Word格式文档下载.docx
《C语言学习笔记计算机基础Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C语言学习笔记计算机基础Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
abc,def,ghi"
"
),最后可以分割成为abcdefghi.尤其在点分十进制的IP中提取应用较多。
7.MIC?
英特尔集成众核(IntelManyIntegratedCore,MIC)架构是英特尔公司现有产品(包括英特尔至强处理器在内)的另一个关键补充。
这种架构能在一颗芯片里面支持200多个线程同时工作。
MIC众核协处理器KnightCorner,和之前上代Larrabee继承者KnightsFerry不同的是,新的KnightsCorner从外表上看是采用与Xeon类似的LGA/BGA封装。
从这点来看,集成50个x86核心,运算能力达到1TFLOPS的KnightsCorner可能会放弃“加速卡”的形式,采用QPI总线替代PCI-E界面。
7.C语言中函数指针变量的详细介绍
函数指针变量的作用:
指向函数入口地址,用来调用函数。
使用函数指针的好处在于,可以将实现同一功能的多个模块统一起来标识,这样一来更容易后期的维护,系统结构更加清晰。
或者归纳为:
便于分层设计、利于系统抽象、降低耦合度以及使接口与实现分开。
函数指针变量定义的一般形式为:
类型说明符(*指针变量名)();
其中"
类型说明符"
表示被指函数的返回值的类型。
"
(*指针变量名)"
表示"
*"
后面的变量是定义的指针变量。
最后的空括号表示指针变量所指的是一个函数。
例如申明函数指针变量:
int(*pf)()或者char*(*pf)();
后者表示pf是一个指向函数入口的指针变量,该函数的返回值(函数值)是指针型,指向字符串。
使用方法:
intmax(intx,inty)
pf=函数名;
(*pf)(intx,inty);
8.conio.h头文件的说明
conio.h不是C标准库中的头文件,在Cstandardlibrary,ISOC和POSIX标准中均没有定义。
conio是ConsoleInput/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如getch()函数等等。
大部分DOS,Windows3.x,PharLap,DOSX,OS/2orWin32平台上的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,那么就可以这么写
#ifdefWINDOWS
a=10;
#endif
#ifdefLINUX
a=20;
#endif;
这样我只要在某个地方定义一个#defineWINDOWS或者#defineLINUX就可以在跨平台的情况下采取不同的策略了.
#undef是在后面取消以前定义的宏定义
18.extern“C”修饰符的理解!
被extern"
C"
修饰的变量和函数是按照C语言方式编译和连接的;
19.C++中增加函数重载的功能的内部原理!
C语言是不支持函数重载功能的,
voidfoo(intx,inty);
该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangledname”)。
_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.引用和指针的区别?
1.从内存上来讲系统为指针分配内存空间,而引用与绑定的对象共享内存空间,系统不为引用变量分配内容空间。
2指针初始化以后可以改变指向的对象,而引用定义的时候必须要初始化,且初始化以后不允许再重新绑定对象。
3.所以引用访问对象是直接访问。
指针访问对象是间接访问。
4。
如果pa是指针,那么*pa就是引用了。
又如inta,&
ra=a;
那么ra就是a的reference了。
22.c语言中头文件、库文件和.c文件的联系与区别。
h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。
附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成LIB文件。
如果要完成源代码的编译和链接,有头文件和lib就够了。
如果也使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
23.C语言中编译链接的过程!
obj文件是目标文件,一般是程序编译后的二进制文件,在通过链接器和资源文件链接就成exe文件了。
OBJ只给出了程序的相对地址,而EXE是绝对地址。
OBJ文件不支持有孔的多边形面。
24.常见字符编码有:
ASCII编码(AmericanStandardCodeforInformationInterchange)基本的ASCII字符集共有128个字符,包括常用的字母、数字、标点符号等,一个字节来存放一个ASCII字符。
BIG-5码:
是通行于台湾、香港地区的一个繁体字编码方案,俗称“大五码”。
GB2312编码:
对ASCII编码的扩充,收录简体中文和常用字符,通用于中国大陆。
每个汉字占用两个字节。
基本集共收入汉字6763个和非汉字图形字符682个。
对于人名、古汉语等方面出现的罕用字,GB2312不能处理,这导致了后来GBK及GB18030汉字字符集的出现。
GBK编码:
对GB2312的扩充,收录了繁体中文,简、繁体字融于一库,每个汉字占用两个字节。
Unicode编码:
注意,Unicode只是一个编码规范,目前实际实现的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字符集中,一个字符可能是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位编码的字符集。
实际上,UTF-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.SqlSever中char、varchar、nchar和nvarchar的对比区别!
ncahr和nvarchar采用unicode编码,固定每个字符占用两个字节,char和varchar固定每个字符采用一个字节。
所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar
我把他们的区别概括成:
CHAR,NCHAR定长,速度快,占空间大,需处理
VARCHAR,NVARCHAR,TEXT不定长,空间小,速度慢,无需处理。
操作系统的语言环境支持中文可以使用char和varchar,如果操作系统环境不支持中文,必须使用nvarchar和ncahr。
请协调好存储代价和兼容性之间的关系。
26.MD5利用salt进行加密的过程程?
用户输入【账号】和【密码】
(以及其他用户信息);
系统为用户生成【Salt值】;
系统将【Salt值】和【用户密码】连接到一起;
对连接后的值进行散列,得到【Hash值】;
将【Hash值1】和【Salt值】分别放到数据库中。
用户登录时,
用户输入【账号】和【密码】;
系统通过用户名找到与之对应的【Hash值】和【Salt值】;
系统将【Salt值】和【用户输入的密码】连接到一起;
对连接后的值进行散列,得到【Hash值2】
(注意是即时运算出来的值);
比较【Hash值1】和【Hash值2】是否相等,相等则表示密码正确,否则表示密码错误。
有时候,为了减轻开发压力,程序员会统一使用一个salt值(储存在某个地方),而不是每个用户都生成私有的salt值。
27.MD5简介!
MessageDigestAlgorithmMD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。
用于确保信息传输完整一致。
是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现
算法原理:
对MD5算法简要的叙述可以为:
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后单目运算符
28.C语言中运算符的优先级别!
30.alloca,malloc、calloc和realloc的理解!
alloca()是分配在栈上,calloc()”是”分配内存给多个对象”,”malloc()”是”分配内存给一个对象”,”realloc()”是”重新分配内存”之意。
”free()”就比较简单了,”释放”的意思,就是把之前所分配的内存空间给释放出来。
参数均为以字节为单位。
alloca不具可移植性,而且在没有传统堆栈的机器上很难实现。
当它的返回值直接传入另一个函数时会带来问题,因为他分配在栈上。
31.strstr(char*str1,char*str2)和strchr(constchar*s,charc)的分别和用法!
是分别求字符串和字符在前面字符串中第一次出现的地址的指针,指针的内容就是地址,返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串位置,如果s中不存在c则返回NULL。
32.strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。
strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。
strcpy不需要指定长度,它遇到被复制字符的串结束符"
\0"
才结束,所以容易溢出。
memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。
通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy。
33.函数指针的用法
函数指针的定义:
//申明函数指针pf
int(*pf)(constint&
constint&
);
//具体函数
intintCompare(constint&
aInt,constint&
bInt)
{}
可将函数指针pf指向函数intCompare
pf=intCompare;
调用:
//使用pf
if(pf(aInt,bInt)==0)
{
cout<
<
twointegersareequal"
<
."
endl;
}
或者用pf来申明其他的函数指针:
//定义函数指针类型cmpFun
typedefint(*cmpFun)(constint&
cmpFunpf=intCompare;
表示:
pf指向函数intCompare();
//函数名可以作为参数,申明形式是函数指针作为参数,其做法为
intplusFun(int&
aInt,int(*paf2)(constint&
))
{
intbInt=1;
intcInt=2;
returnaInt+paf2(bInt,cInt);
}
函数指针作为返回值
一个函数的返回值可以是一个函数指针,这个声明形式写起来有点麻烦:
//函数指针作为返回值
int(*retFunPointer(int))(constint&
上面的声明的含义:
a)
retFunPointer是一个函数,该函数有一个int类型的参数;
b)
retFunPointer返回值是一个函数指针,它指向的是带有两个constint&
类型参数,且返回类型为int的函数。
retFunPointer的定义:
//函数指针为返回值,整个函数名为retFunPointer,把自己装扮成函数指针,作为返回值。
int(*retFunPointer(intaInt))(constint&
)
cout<
aInt<
//pf已经在前面定义过了
returnpf;
调用代码示例:
//函数指针作为返回值,retFunPointer返回一个cmpFun类型的函数指针
cmpFunpf3=retFunPointer(aaInt);
intresult=pf3(aaInt,bbInt);
cout<
result<
34.注意:
C语言中,头文件中include的头文件内申明的函数,在当前.c文件中,是可以间接调用的!
35.注意
C语言中没有bool类型,用0和1来表示真假!
C语言和C++都是强类型的,变量在申明时候就要指定类型,而不是等编译器根据编译时候所赋的值来确定其便编译时的类型。
36.MD5算法原理简介!
MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
也就是32个十六进制的字符,每个字符占4位从0到f,均为小写,因此叫做128位散列值。
37.strncmp()函数简介
用法:
intstrncmp(char*str1,char*str2,intmaxlen);
说明:
此函数功能即比较字符串str1和str2的前maxlen个字符。
如果前maxlen字节完全相等,返回值就=0;
在前maxlen字节比较过程中,如果出现str1[n]与str2[n]不等,则返回(str1[n]-str2[n])[1]。
38.<
和>
>
这三个运算符号的理解
(左移)
运算规则:
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
数学意义:
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
(带符号右移)
按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
右移一位相当于除2,右移n位相当于除以2的n次方。
这里是取商哈,余数就不要了。
(无符号右移)
按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零。
对于正数来说和带符号右移相同,对于负数来说不同。
其他结构和>
相似。
39.getch()函数和getchar()函数的区别
getch():
所在头文件:
conio.h
函数用途:
从控制台读取一个字符,但不显示在屏幕上,然后程序继续执行下去。
getchar()函数:
所在头文件时stdio.h
函数用途:
用户按下字符后,等待用户按下回车,然后继续执行,且返回值显示在屏幕上。
40.注意
strlen()函数求字符串长度的时候不会讲结尾符号\0算进去。
substr()函数是C++中的函数,C语言中没有这个函数,要想实现这个功能,可以使用strncpy()或者memcpy来实现。
41.strncpy()和memcpy()的区别
二者都可指定长度来实现串的拷贝。
不同点是当然有区别,strncpy()时拷贝字符串,memcpy()是拷贝内存内容,可以拷贝其他类型的数据。
42.sizeof()函数
sizeof是运算符,可用于任何变量名、类型名或常量值,当用于变量名(不是数组名)或常量时,它不需要用圆括号。
它在编译时起作用,而不是运行时。
sizeof的结果等于对象或者类型所占的内存字节数,包括字符串的结尾符\0,strlen()求字符串的长度不包括结尾符\0。
43.memset()函数,解决内存内存空间出现屯屯屯屯屯屯和烫烫烫烫烫烫乱码
void*memset(void*s,charch,size_tn);
将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作,其返回值为指向S的指针。
其中void*s空指针,指针不指向任何地址空间。
初始化内存地址空间后就会解决乱码问题,用memset(s,NULL,sizeof(s)).乱码问题是因为使用malloc()申请的内存空间没有初始化,默认赋值0xcc,打印出来就是屯屯屯,malloc申请的空间是在"
堆"
上的,可手动释放。
使用alloca()申请内存会产生烫烫烫烫烫烫,与malloc,calloc,realloc类似,但是注意一个重要的区别,_alloca是在栈(stack)上申请空间,用完马上就释放,无需手动释放。
44.c语言中定义变量不赋初值默认是多少?
C语言中,没有加static默认为auto型此时不给初值的变量的初值是随机的,但是如果加了static,不给初值的变量的初值是默认是0,指针也是一样,其实NULL的值就是0,只是它不代表任何地址。
45.C语言从源码到可执行程序的四个过程
预处理(也称预编译,Preprocessing):
C语言的预处理主要有三个方面的内容:
1.宏定义;
2.文件包含;
3.条件编译。
预处理命令以符号“#”开头,这个方面本质是将需要的代码包含到当前的.c文件中。
编译(Compilation):
编译所做的工作就是词法分析,语法分析,在进行汇编成中间代码,汇编代码。
汇编(Assem