论坛: 编程破解 标题: C语言问题:指针到底在什么时候会很方便库函数的问题 复制本贴地址    
作者: kert_t8 [kert_t8]    论坛用户   登录
1,记得烟雨平生说指针这个东西用好了以后程序的效率会大幅度提高,但是我一直不明白为什么,自然就不知道怎么用才会使程序运行速度提高。我在网上找到的关于指针的资料大都是将如何正确使用指针,没有告诉我如何有效,或者说是高效的使用指针,更没有解释为什么会高效。能不能给我解释一下?

2,我常常想找出库函数的源代码来看一看,但是我们在#include的时候,往往用的是头文件,像string.h  stdio.h 之类的,当我打开它们的时候只能找到函数的声明,没有具体的实现,然而我又找不到 string.c stdio.c之类的文件,那么像printf之类的函数的具体实现是在哪里呢?

还有,比如我自己有一个main.c 一个 infile.c 和一个 infile.h,我应该写成
--------------------
main.c:
#include "infile.c"
--------------------
infile.c:
#include "infile.h"
--------------------
infile.h:
#include <other files>

还是
main.c:
#include "infile.h"
---------------------
infile.c:
//没有任何include 和 define
---------------------
infile.h:
#include "infile.c"
#include <other files>

??????????

这是一个业界标准的问题,关系不大,但是我很好奇

地主 发表时间: 05-01-30 16:27

回复: jhkdiy [jhkdiy]   版主   登录
第二个:我隐约记得是这样的:C语言是采用静态连接方式的, 我们平常先包含标准的头文件,而头文件是标准函数的声明, 编译的时候编译程序会给标准的函数预留一个序号,在进行连接的时候连接程序会把真正实现函数的代码根据序号嵌入到源程序中的。在汇编语言中,这些已实现函数功能的代码在。Lib文件中,而C语言只要在源程序中包括头文件声明就可以了,C语言进行隐式连接。
不知道是否有错,还请高手做详细解答,第一个我也想学。

B1层 发表时间: 05-01-31 01:20

回复: SysHu0teR [syshunter]   版主   登录
第一种我见过不多,第二种如果项目不大的话经常使用。但稍微大点的项目常用的还是我们上次讨论的那个。
infile.h:
infile.c的函数申明

infile.c:
include "infile.h"
函数实现

main.c:
include "infile.h"

在把infile.c单独编译成obj后,当只需要改动main时,重新编译项目时我们不需要再次编译infile.c,效率提高。也是Makefile常用手法。

B2层 发表时间: 05-01-31 09:27

回复: TomyChen [quest]   版主   登录
1.简单的说比如
pBuf是一块100M的内存空间。
这时候需要在这块内存中找出"abcdefg"这个字符串,但找出后又要保持pBuf数据的完整性。这时候做法有两种,第一种,完全复制一个pBuf样本出来操作,操作完后,将其删除;第二种就是用一个指针去对pBuf进行操作。这时候,从时间、空间上算,很明显都是指针比较好。

2.C除了源文件外,还有个叫库的东西(B1已经给出答案)。翻书找找,比如谭浩强的书中就有提到 9.2章 文件包含 处理

B3层 发表时间: 05-01-31 17:18

回复: NetDemon [netdemon]   ADMIN   登录
string.c stdio.c 之类的文件是有的
如果你使用FreeBSD
你能够在/usr/src/lib/libc 下面找到,有所有C库的源文件,linux当然也有,不过很多的发行版都是不带的

比如这个,就是strlen的源代码
代码:

#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)strlen.c    8.1 (Berkeley) 6/4/93";
#endif /* LIBC_SCCS and not lint */
#ifndef lint
static const char rcsid[] =
  "$FreeBSD: src/lib/libc/string/strlen.c,v 1.1.1.1.14.1 2001/07/09 23:30:07 obrien Exp $";
#endif

#include <sys/cdefs.h>
#include <string.h>

size_t
strlen(str)
        const char *str;
{
        register const char *s;

        for (s = str; *s; ++s);
        return(s - str);
}




B4层 发表时间: 05-01-31 19:36

回复: zuosi [zuosi]   论坛用户   登录
#include <string.h>
size_t strlen(str)       
const char *str;
{register const char *s;     
for (s = str; *s; ++s);     
  return(s - str);}
这样的函数好爽   移植 效率 ...唯一的缺点就是用了老式的参数声明方法.

B5层 发表时间: 05-02-01 16:57

回复: kert_t8 [kert_t8]   论坛用户   登录
按照TA的解释,我的理解如下

1, xxxxxxxx.c文件仅仅include "xxxxxxxx.h"
2, 任何.c文件都不会被任何文件include
////////////////////////////////////////////////////////////////////////////
诸如
引用:
还有,比如我自己有一个main.c 一个 infile.c 和一个 infile.h,我应该写成
--------------------
main.c:
#include "infile.c"
--------------------
infile.c:
#include "infile.h"
--------------------
infile.h:
#include <other files>

还是
main.c:
#include "infile.h"
---------------------
infile.c:
//没有任何include 和 define
---------------------
infile.h:
#include "infile.c"
#include <other files>


都是不好的方法

3,要把两段代码连到一起,可以使用文本联接(我自己起的名字,不知道对不对),也可以先编译成.o文件(gcc -c xxxx.c -o xxxx.o),然后联接起来(gcc -o xxxx.exe 1.o 2.o .... n.o). 但是两种方式原理不一样,因此使用include的方式也不一样.开始所说的include方式适合于第二种联接方式.
4, 在第二种方式下,所有的.h文件仅仅为程序提供一个类型声明,所有的实现都放在.o里面,等到 gcc -o dest.exe 1.o 2.o ... n.o 的时候再连接到一起. 正因为这样,所有的.c文件才可以都不被include

我自己都晕了

B6层 发表时间: 05-02-08 15:06

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号