可能是我智商不行啊

beysion 2004-05-06 07:05:45
我是学C的,对头文件里到底有什么东西,我不是很清楚.老师也没说,请问哪位大哥是否有关这个方面的资料,有什么方法能够了解其中的知识,我的QQ:214540165
...全文
54 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouqingyuan 2004-05-07
  • 打赏
  • 举报
回复
这和智商有关系吗?
beysion 2004-05-07
  • 打赏
  • 举报
回复
itoa char* itoa(int value,char *string,int radix); 将整数类型的数值转换为字符串,radix描述了进制的选择,范围在2到36之间
fcvt char *fcvt(double value,int count,int *dec,int *sign); 将浮点数转换为字符串,value为要被转换的数值,count为小数点后的位数,dec为小数点所在的位置,sign描述正负号
随机数 srand void srand(unsigned int seed); 设定随机种子
cheilei,你能否对第个上面的每个函数举个小小的例子啊,还有什么是随机种子,谢谢.
能否有关其他的头文件像stdio.h这样介绍一下啊
xiaonian_3654 2004-05-06
  • 打赏
  • 举报
回复
不要太着急,现在你先好好练一练算法

netmars2003 2004-05-06
  • 打赏
  • 举报
回复
楼上这位,好厉害呀!
jingfei303 2004-05-06
  • 打赏
  • 举报
回复
介绍得很详细,适合我们这些初学者,谢谢
02051223 2004-05-06
  • 打赏
  • 举报
回复
TC操作手册之三——指针与内存操作
下面来介绍C语言功能最强大的特点,同时也是相对而言比较难掌握的概念之一——指针。
一、指针的基本概念
如同其它基本类型的变量一样,指针也是一种变量,但它是一种把内存地址作为其值的变量。因为指针通常包含的是一个拥有具体值的变量的地址,所以它可以间接地引用一个值。

二、指针变量的声明、初始化和运算符
声明语句
int *ptra, a;
声明了一个整型变量a与一个指向整数值的指针ptra,也就是说,在声明语句中使用*(称为“间接引用运算符”)即表示被声明的变量是一个指针。指针可被声明为指向任何数据类型。需要强调的是,在此语句中变量a只被声明为一个整型变量,这是因为间接引用运算符*并不针对一条声明语句中的所有变量,所以每一个指针都必须在其名字前面用前缀*声明。指针应该用声明语句或赋值语句初始化,可以把指针初始化为0、NULL或某个地址,具有值0或NULL的指针不指向任何值,而要想把某个变量地址赋给指针,需使用单目运算符&(称为“地址运算符”)。

例如程序已用声明语句

int *ptra, a=3;

声明了整型变量a(值为3)与指向整数值的指针a,那么通过赋值语句

ptra=&a;

就可以把变量a的地址赋给指针变量ptra。需要注意的是不可将运算符&用于常量、表达式或存储类别被声明为register的变量上。被赋值后的指针可以通过运算符*获得它所指向的对象的值,这叫做“指针的复引用”,例如打印语句

printf("%d", *ptra);

就会打印出指针变量ptra所指向的对象的值(也就是a的值)3。如果被复引用的指针没有被正确的初始化或没有指向具体的内存单元都会导致致命的执行错误或意外地修改重要的数据。printf的转换说明符%p以十六进制整数形式输出内存地址,例如在以上的赋值后,打印语句

printf("%p", &a);
printf("%p", ptra);

都会打印出变量a的地址。

三、指针表达式和算术运算以及数组、字符串和指针的关系
在算术表达式、赋值表达式和比较表达式中,指针是合法的操作数,但是并非所有的运算符在与指针变量一起使用时都是合法的,可以对指针进行的有限的算术运算包括自增运算(++)、自减运算(--)、加上一个整数(+、+=)、减去一个整数(-或-=)以及减去另一个指针。

数组的各元素在内存中是连续存放的,这是指针运算的基础。现在假设在一台整数占4个字节的机器上,指针ptr被初始化指向整型数组a(共有三个元素)的元素a[0],而a[0]的地址是40000,那么各个变量的地址就会如下表所示:

表达式 ptra &a[0] &a[1] &a[2]
表达式的意义 指针ptra的值 元素a[0]的地址 元素a[1]的地址 元素a[2]的地址
表达式的值 40000 40000 40004 40008

必须注意,指针运算不同于常规的算术运算,一般地,40000+2的结果是40002,但当一个指针加上或减去一个整数时,指针并非简单地加上或减去该整数值,而是加上该整数与指针引用对象大小的乘积,而对象的大小则和机器与对象的数据类型有关。例如在上述情况下,语句

ptra+=2;
的结果是40000+4*2=40008, ptra也随之指向元素a[2],同理,诸如语句

ptra-=2;
ptra++;
++ptra;
ptra--;
ptra--;

等的运算原理也都与此相同,至于指针与指针相减,则会得到在两个地址之间所包含的数组元素的个数,例如ptra1包含存储单元40008,ptra2包含存储单元40000,那么语句

x = ptra1 - ptra2;

得到的结果就是2(仍假设整数在内存中占4个字节)。因为除了数组元素外,我们不能认为两个相同类型的变量是在内存中连续存储的,所以指针算数运算除了用于数组外没有什么意义。

如果两个指针类型相同,那么可以把一个指针赋给另一个指针,否则必须用强制类型转换运算符把赋值运算符右边的指针的类型转换为赋值运算符左边指针的类型。例如ptr1是指向整数的指针,而ptr2是指向浮点数的指针,那么要把ptr2的值赋给ptr1, 则须用语句

ptr1 = (int *) ptr2;

来实现。唯一例外的是指向void类型的指针(即void *),因为它可以表示任何类型的指针。任何类型的指针都可以赋给指向void类型的指针,指向void类型的指针也可以赋给任何类型的指针,这两种情况都不需要使用强制类型转换。

但是由于编译器不能根据类型确定void *类型的指针到底要引用多少个字节数,所以复引用void *指针是一种语法错误。

可以用相等测试运算符和关系运算符比较两个指针,但是除非他们指向同一个数组中的元素,否则这种比较一般没有意义。相等测试运算符则一般用来判断某个指针是否是NULL,这在本文后面提到内存操作中有一定的用途。

C语言中的数组和指针有着密切的关系,他们几乎可以互换,实际上数组名可以被认为是一个常量指针,假设a是有五个元素的整数数组,又已用赋值语句

ptra = a;

将第一个元素的地址赋给了指向整数的指针ptra,那么如下的一组表达式是等价的:

a[3] ptra[3] *(ptra+3) *(a+3)

它们都表示数组中第四个元素的值。

又因为C语言中的字符串是用空字符('\0')结束的字符数组,所以事实上,字符串就是指向其第一个字符的指针。但是还是要提醒大家,数组名和字符串名都是常量指针,他们的值是不可被改变的,例如程序段

char s[]="this is a test.";
for (;*s='\0';s++)
printf("%c", *s);

是错误的,因为它试图在循环中改变s的值,而s实际上是一个常量指针。

在本部分的最后,说一说指向函数的指针。指向函数的指针包含了该函数在内存中的地址,函数名实际上就是完成函数任务的代码在内存中的起始地址。函数指针常用在菜单驱动系统中。

02051223 2004-05-06
  • 打赏
  • 举报
回复
总之 头文件里的东西是库函数,而库函数是很使用且可行度很高的函数代码
02051223 2004-05-06
  • 打赏
  • 举报
回复
TC运行库函数介绍
原创:怒火之袍 2002年11月16日



对于很多刚刚接触C语言和TC环境的同学,学习面向过程和结构化的思想以及C语言的语法是学习中的重中之重,但是在对此二者有了一个比较牢固的基础之后若想继续提高,一是要学习一些常用的能够解决实际问题的处理方法和计算机在存储数据方面的知识,我们称之为算法和数据结构,这能使你可以解决问题的数量大幅度增加;二是要学习所使用的语言和环境给我们提供的可以直接利用的资源,也就是库。

随着计算机技术的迅猛发展,我们要处理和解决的问题规模越来越大,结构也越来越复杂,这决定了我们在编程的时候不可能每个细节都从零写起,而要运用许多现成的可以保证正确的代码来实现比较固定的功能,这种固定的功能实现常常以库函数的形式体现出来。C语言的库中提供了许多实现某一特定目的的函数,这能使你编程的效率大大提高,并且使程序的逻辑更加清晰。

预备知识
有些同学在学习库函数的时候感觉特别痛苦,其中部分原因是由于对语言的基本概念掌握不牢所造成的。对于C语言,要想熟练地使用库函数,必须对函数的调用机制,形参实参的传递过程和返回值的处理有一个全面而准确的认识,弄清传值调用和传地址调用的区别的联系,充分掌握这些知识才能很快理解别人写出的函数在接口和实现的功能上存在着怎样的联系。另外,如果你不只满足于使用库中的函数而有志于通过剖解它们的代码来获取别人的编程经验,那么你还需要拥有较强的阅读程序的能力。

最常用库函数介绍
即使对于初学者,也有一些函数是在练习编程的过程中无可避免地将使用到的,对于这种使用频繁的函数我们有必要尽快掌握,实际上这些函数通常集中声明在以下几个头文件中:<stdio.h>、<math.h>和<stdlib.h>。

<stdio.h>中声明了C语言中大部分关于输入输出操作的函数,我们只需要调用这些函数便能对输入与输出做出处理,而不需要考虑到硬件的问题。大家从接触C语言开始,哪怕是最简单的“Hello,world”程序也要在程序开始写下一行#include <stdio.h>,可见这个头文件中所声明函数的使用频率之高。

这个头文件中所声明关于标准输入输出的常用函数列表如下:

函数名 函数原型 具体功能
scanf int scanf(const char*format[,argument]...); 从标准输入装置读入数据,并可根据argument做的设定,把数据依照要求的格式写到要求的位置
printf int printf(const char*format [,argument]...); 将所有数据格式化并一起输出到标准输出装置
gets char *gets(char *buffer); 从标准输入数据流里取得一整行的数据,并存入buffer中。它会直接取得所有输入的字符,直到欲换行为止
puts int puts(const char *string); 把指定字符串输出给标准输出装置
getchar int getchar(void); 由标准输入装置读取一个字符
putc int putc(int c); 将单个字符输出到标准输出装置

除了关于标准输入输出的函数之外,<stdio.h>中还声明了大量与文件读写操作有关的函数,这些函数中的一部分和标准输入输出的功能类似,只不过将数据流改变到了文件上;另一部分是为文件打开、关闭以及文件指针定向等提供的基本操作,同学们可以在学习了和文件操作相关的内容之后再来复习它们。此外,<stdio.h>中的sscanf和sprintf两个函数可以利用字符串进行读写操作,在一些特定的场合可以为数据转换提供很大的方便。

<math.h>中声明的库函数用来处理相关的数学问题,这些数学函数大部分都是作用于浮点数类型的数据,其所支持的功能包括三角函数数值运算、指数对数运算、绝对值以及一些基本的数值处理,现在将这些函数用下表加以总结:

功能范围 函数名 函数原型 具体功能
三角函数与
反三角函数 sin double sin(double x); 计算x弧度的正弦值
cos double cos(double x); 计算x弧度的余弦值
tan double tan(double x); 计算x弧度的正切值
asin double asin(double x); 计算绝对值不大于1的浮点数的反正弦值
acos double acos(double x); 计算绝对值不大于1的浮点数的反余弦值
atan double atan(double x); 计算浮点数的反正切值
指数对数运算 log double log(double x); 计算正浮点数的自然对数值
log10 double log10(double x); 计算正浮点数的以10为底的对数值
pow double pow(double x,double y); 计算x的y次方
exp double exp(double x); 计算e的x次方
sqrt double sqrt(double x); 计算非负浮点数的平方根
绝对值计算 fabs double fabs(double x); 计算浮点数的绝对值
数值处理 ceil double ceil(double x); 求出大于一个浮点数的最小整数
floor double floor(double x); 求出小于一个浮点数的最大整数
modf double modf(double x,int *intptr); 求浮点数的小数部分,整数部分写入第二个参数指向的地址
fmod double fmod(double x,double y); 求两浮点数相除后的余数

熟悉数学库中的函数是学习编程过程中必不可少的一环,因为这些函数如同输入输出函数一样有着较高的使用频率,并且其中的一部分很难自己写出源码实现。

<stdlib.h>中声明了许多相当基本的函数,让C语言的使用者仅仅使用标准函数库就能实现强大的功能,其中涉及到数据类型转换、内存操作、随机数处理、排序和程序流程控制等方方面面的内容,在下表中笔者着重介绍数据类型转换和随机数处理这两个初学者比较常用方面的常用函数,关于内存操作的函数读者可以在

http://www.frontfree.net/articles/services/view.asp?id=504&page=1

中找到比较详细的说明。

功能范围 函数名 函数原型 具体功能
数据类型转换 atof double atof(const char *string); 将字符串转换为浮点类型
atoi int atoi(const char *string); 将字符串转换为整数类型
atol long atol(const char *string); 将字符串转换为长整数类型
itoa char* itoa(int value,char *string,int radix); 将整数类型的数值转换为字符串,radix描述了进制的选择,范围在2到36之间
fcvt char *fcvt(double value,int count,int *dec,int *sign); 将浮点数转换为字符串,value为要被转换的数值,count为小数点后的位数,dec为小数点所在的位置,sign描述正负号
随机数 srand void srand(unsigned int seed); 设定随机种子
rand int rand(void); 随机产生一数值

另外几个比较常用的头文件所声明的函数功能
除了<stdio.h>、<math.h>和<stdlib.h>之外,还有一些头文件中声明了比较常用的函数,下表总结了一些头文件所声明函数的功能范围。

头文件 头文件中所声明函数的功能描述
<assert.h> 在程序执行过程中设定插入点,便于程序员进行究错工作
<time.h> 处理时间,便于程序员使用到系统的时间
<string.h> 对字符串的各种处理
<ctype.h> 对字符的相关处理
<graphics.h> 与在图形界面作图有关的处理

结语
本文介绍的只是C语言和TC环境函数库中所提供的库函数的最常用的很小的最一部分,许多库函数涉及到的理论和应用需要读者对语言本身的原理和机制了解加深后才可以得到较为透彻的体会。另外笔者建议大家在学习相关内容的同时可以参考库函数的实现,因为这些代码大都简洁精炼,可以作为很好的教材。比如吃透<string.h>中所声明的各个函数的原码,那么你对字符串处理的能力和感觉以及对指针的认识都会有一个较大的提高。总之,库函数除了提高你的编程效率,让你放心地使用一些品质优良的零件之外,还能帮你巩固所学的知识,提高阅读代码的能力,告诉你钢铁是怎样炼成的。

freefalcon 2004-05-06
  • 打赏
  • 举报
回复
晕,楼主不是问"头文件里到底有什么东西"吗,又没有问函数的具体实现
fire314159 2004-05-06
  • 打赏
  • 举报
回复
打开了也没用,它叫头文件,就证明不会让你看到真东西。所谓头文件就是别人编好的库函数的集成好的函数是有知识产权的。turboc里的库函数是商业机密。热切期待你的自定义函数以后也能成为库函数赚钱钱。:)
wolftop 2004-05-06
  • 打赏
  • 举报
回复
顾名思义~!
freefalcon 2004-05-06
  • 打赏
  • 举报
回复
如楼上所说

对于头文件,你打开看一下就知道了里面于什么了(一般附带在编译器的安装目录下include文件夹里)
realyzeal 2004-05-06
  • 打赏
  • 举报
回复
简单地说,你的一个文件里面不可能包含所有你所使用到的函数,为了使用在被的文件里面的函数,就要使用头文件来说明在那个文件里面有你要使用的函数。
对变量、结构等同样理解

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧