精华内容
下载资源
问答
  • C语言(函数)

    2021-05-12 15:47:21
    3.1、C语言什么会有函数 (1)整个程序分成多个源文件,一个文件分成多个函数,一个函数分成多个语句,这就是整个程序的组织形式。这样组织的好处在于:分化问题、便于编写程序、便于分工。 (2)函数的出现人...

    3.函数的本质

    3.1、C语言为什么会有函数
    (1)整个程序分成多个源文件,一个文件分成多个函数,一个函数分成多个语句,这就是整个程序的组织形式。这样组织的好处在于:分化问题、便于编写程序、便于分工。
    (2)函数的出现是人(程序员和架构师)的需要,而不是机器(编译器、CPU)的需要。
    (3)函数的目的就是实现模块化编程。说白了就是为了提供程序的可移植性。

    3.2、函数书写的一般原则:
    第一:遵循一定格式。函数的返回类型、函数名、参数列表等。
    第二:一个函数只做一件事:函数不能太长也不宜太短,原则是一个函数只做一件事情。
    第三:传参不宜过多:在ARM体系下,传参不宜超过4个。如果传参确实需要多则考虑结构体打包
    第四:尽量少碰全局变量:函数最好用传参返回值来和外部交换数据,不要用全局变量。

    3.3、函数是动词、变量是名词(面相对象中分别叫方法和成员变量)
    (1)函数将来被编译成可执行代码段,变量(主要指全局变量)经过编译后变成数据或者在运行时变成数据。一个程序的运行需要代码和数据两方向的结合才能完成。
    (2)代码和数据需要彼此配合,代码是为了加工数据,数据必须借助代码来起作用。拿现实中的工厂来比喻:数据是原材料,代码是加工流水线。名词性的数据必须经过动词性的加工才能变成最终我们需要的产出的数据。这个加工的过程就是程序的执行过程。

    3.4、函数的实质是:数据处理器
    (1)程序的主体是数据,也就是说程序运行的主要目标是生成目标数据,我们写代码也是为了目标数据。我们如何得到目标数据?必须2个因素:原材料+加工算法。原材料就是程序的输入数据,加工算法就是程序。
    (2)程序的编写和运行就是为了把原数据加工成目标数据,所以程序的实质就是一个数据处理器。
    (3)函数就是程序的一个缩影,函数的参数列表其实就是为了给函数输入原材料数据,函数的返回值和输出型参数就是为了向外部输出目标数据,函数的函数体里的那些代码就是加工算法。
    (4)函数在静止没有执行(乖乖的躺在硬盘里)的时候就好象一台没有开动的机器,此时只占一些存储空间但是并不占用资源(CPU+内存);函数的每一次运行就好象机器的每一次开机运行,运行时需要耗费资源(CPU+内存),运行时可以对数据加工生成目标数据;函数运行完毕会释放占用的资源。
    (5)整个程序的运行其实就是很多个函数相继运行的连续过程。

    4.函数的基本使用

    4.1、函数三要素:定义、声明、调用
    (1)函数的定义就是函数体、函数声明是函数原型、函数调用就是使用函数
    (2)函数定义是函数的根本,函数定义中的函数名表示了这个函数在内存中的首地址,所以可以用函数名来调用执行这个函数(实质是指针解引用访问);函数定义中的函数体是函数的执行关键,函数将来执行时主要就是执行函数体。所以一个函数没有定义就是无基之塔。
    (3)函数声明的主要作用是告诉编译器函数的原型
    (4)函数调用就是调用执行一个函数。

    4.2、函数原型和作用
    (1)函数原型就是函数的声明,说白了就是函数的函数名、返回值类型、参数列表。
    (2)函数原型的主要作用就是给编译器提供原型,让编译器在编译程序时帮我们进行参数的静态类型检查
    (3)必须明白:编译器在编译程序时是以单个源文件为单位的(所以一定要在哪里调用在哪里声明),而且编译器工作时已经经过预处理处理了,最最重要的是编译器编译文件时是按照文件中语句的先后顺序执行的。
    (4)编译器从源文件的第一行开始编译,遇到函数声明时就会收到编译器的函数声明表中,然后继续向后。当遇到一个函数调用时,就在我的本文件的函数声明表中去查这个函数,看有没有原型相对应的一个函数(这个相对应的函数有且只能有一个)。如果没有或者只有部分匹配则会报错或报警告;如果发现多个则会报错或报警告(函数重复了,C语言中不允许2个函数原型完全一样,这个过程其实是在编译器遇到函数定义时完成的。所以函数可以重复声明但是不能重复定义)
    4.3、函数传参

    5.递归函数

    5.1、什么是递归函数
    (1)递归函数就是函数中调用了自己本身这个函数的函数。
    (2)递归函数和循环的区别。递归不等于循环
    (3)递归函数解决问题的典型就是:求阶乘、求斐波那契数列

    5.2、函数的递归调用原理
    (1)实际上递归函数是在栈内存上递归执行的,每次递归执行一次就需要耗费一些栈内存。
    (2)栈内存的大小是限制递归深度的重要因素。

    5.3、使用递归函数的原则:收敛性、栈溢出
    (1)收敛性就是说:递归函数必须有一个终止递归的条件。当每次这个函数被执行时,我们判断一个条件决定是否继续递归,这个条件最终必须能够被满足。如果没有递归终止条件或者这个条件永远不能被满足,则这个递归没有收敛性,这个递归最终要失败。
    (2)因为递归是占用栈内存的,每次递归调用都会消耗一些栈内存。因此必须在栈内存耗尽之前递归收敛(终止),否则就会栈溢出。
    (3)递归函数的使用是有一定风险的,必须把握好。
    递归函数实现阶乘

    #include <stdio.h>
    
    int jiecheng(int n);		// 函数声明
    void digui(int n);
    
    int main(void)
    {
    	digui(300);
    
    	//int a = 5;
    	//printf("%d的阶乘是:%d.\n", a, jiecheng(a));
    
    	return 0;
    }
    
    // 函数定义
    int jiecheng(int n)
    {
    	// 传参错误校验
    	if (n < 1)
    	{
    		printf("n必须大于等于1.\n");
    		return -1;
    	}
    	
    	if (n == 1)
    	{
    		return 1;
    	}
    	else
    	{
    		return (n * jiecheng(n-1));
    	}
    }
    
    void digui(int n)
    {
    	int a[100];
    	//printf("递归前:n = %d.\n", n);
    	if (n > 1)
    	{
    		digui(n-1);
    	}
    	else
    	{
    		printf("结束递归,n = %d.\n", n);
    	}
    	printf("递归后:n = %d.\n", n);
    }
    
    
    
    
    展开全文
  • dev运行时出现源文件未编译的情况是什么原因,应该怎么样解决呢#includeintmain(){intday,month,year,sum,leap;printf("\n请输入年、月、日,格式为:年,月,日(2015,12,10)\n");scanf("%d,%d,%d",&year,&...

    dev运行时出现源文件未编译的情况是什么原因,应该怎么样解决呢

    9b5b8b605afc27f0cf69ed78019695af.png#include 

    int main()

    {

    int day,month,year,sum,leap;

    printf("\n请输入年、月、日,格式为:年,月,日(2015,12,10)\n");

    scanf("%d,%d,%d",&year,&month,&day);  // 格式为:2015,12,10

    switch(month) // 先计算某月以前月份的总天数

    {

    case 1:sum=0;break;

    case 2:sum=31;break;

    case 3:sum=59;break;

    case 4:sum=90;break;

    case 5:sum=120;break;

    case 6:sum=151;break;

    case 7:sum=181;break;

    case 8:sum=212;break;

    case 9:sum=243;break;

    case 10:sum=273;break;

    case 11:sum=304;break;

    case 12:sum=334;break;

    default:printf("data error");break;

    }

    sum=sum+day; // 再加上某天的天数

    if(year%400==0||(year%4==0&&year%100!=0)) {// 判断是不是闰年

    leap=1;

    } else {

    leap=0;

    }

    if(leap==1&&month>2) { // *如果是闰年且月份大于2,总天数应该加一天

    sum++;

    }

    printf("这是这一年的第 %d 天。",sum);

    printf("\n");

    return 0;

    }

    展开全文
  • 函数声明用来说明我们的代码中包含一个什么样的函数,函数声明可以放在头文件(.h)或者源文件(.c)中,函数声明的格式如下:返回值类型 函数名(参数表);函数定义函数的实现,函数定义的格式如下:返回值类型 函数名...

    函数是C语言的重要组成部分,通过函数我们可以将复杂逻辑进行封转,缩减程序员在编码和维护中的关注点数量,提高代码质量,方便对代码进行维护。


    函数声明用来说明我们的代码中包含一个什么样的函数,函数声明可以放在头文件(.h)或者源文件(.c)中,函数声明的格式如下:

    返回值类型 函数名(参数表);


    函数定义是函数的实现,函数定义的格式如下:

    返回值类型 函数名(参数表) {

            C语言语句

    }


    函数声明不是必须的,如果省略了函数声明,我们必须将函数定义按照调用顺序进行组织,比如下面的伪代码:

    void foo1() {

            ........

            // foo3();   //编译错误,找不到函数

            // foo2();   //编译错误,找不到函数

    }


    void foo3() {

            foo1();     //正确,foo1()在foo3()前面定义

            ........

            // foo2();   //编译错误,找不到函数

    }


    void foo2() {

            foo3();  //正确,foo3在foo2前面定义

            .......

    }


    所以,一般把开放给外部的函数声明放在.h文件中,然后在使用这些函数的.c文件中通过#include导入,


    演示一个简单的函数,function.h中进行声明

    #ifndef FUNCTION_H
    #define FUNCTION_H
    
    int add(int a, int b);
    
    #endif

    function.c中定义

    #include "function.h"
    
    int add(int a, int b) {
    	return a + b;
    }

    该函数实现两个整型数的相加,通过两个参数a和b,将计算结果a+b通过return语句返回。main.c中使用该函数

    #include <stdio.h>
    #include "function.h"
    
    int main(void) {
    	int a = 10;
    	int b = 20;
    	printf("a + b = %d\n", add(a, b));
    }

    函数的输出为

    a + b = 30


    下面我们着重讨论函数的参数,在上面函数定义中,参数列表中的a和b被称为形参,他们是函数作用域内的局部变量,如果函数外部还有变量a和b(如main中的变量a和b),形参将会隐藏外部的同名变量。


    函数的参数按值传递,什么叫按值传递呢?如果参数是基本类型的变量,如int, float等,则将变量值进行传递,我们对形参的改变不会改变外部变量的值,如果传入的参数是指针,则传入的参数是指针变量的值,也就是一个内存地址,这样,我们基于形参的指针变量,是可以改变内存地址指向的内存中的数值的,看下面改版的add函数,在function.h中加入一个新的函数声明

    int add(int a, int b);
    void add_use_pointer(int a, int b, int *result);


    add_use_pointer函数不返回值,而是通过一个指针变量result返回值。function.c中的实现如下

    void add_use_pointer(int a, int b, int *result) {
    	*result = a + b;
    }

    不再调用return语句,而是将a+b的值赋值给了一个指针变量所指向的内存。main.c中的调用

    int result = 0;
    add_use_pointer(a, b, &result);
    printf("a + b = %d\n", result);

    输出结果为

    a + b = 30


    可以看到,main中定义的result,初始化为0,但是执行函数add_use_pointer之后,值通过指针被设置为了30。使用指针返回值,可以让我们的函数轻松返回多个值,不过,使用指针返回多个值,不应该返回过多的值,否则会加长参数列表,这是非常不好的代码形式。如果采用return,希望返回多个值,则需要将返回值绑为一个结构体(后面的文章会介绍),而使用结构体,是C语言实现面向对象的一种手段。


    介绍完函数,我们补充看一个问题,C语言中{}之间的部分被称之为代码块,在代码块中定义的变量,其作用域就在该代码块中,也就是说,在代码块之外无法访问该变量,另外,如果没有使用动态内存分配,局部变量在离开代码块时,占用的内存会被释放,生存期仅限于代码块。如果一个变量不属于任何函数,那么该变量就是一个全局变量,如果在任何代码块中都没有同名变量,则我们可以在代码的所有位置访问到该变量,生存期为整个程序的运行时间。看下面的例子,我们在function.c中定义了一个全局变量

    int global_int = 100;

    在function.h中,我们使用extern关键字导出该全局变量

    extern int global_int;

    main.c中我们包含了头文件function.h,所以也就导出了全局变量,我们可以直接使用

    printf("global_int = %d\n", global_int);

    main.c中我们包含了头文件function.h,所以也就导出了全局变量,我们可以直接使用


    输出为

    global_int = 100


    C语言还提供了一个static关键字,用来定义静态变量或静态函数,对于静态变量,可以分为静态全局变量和静态局部变量。给一个简单的静态全局变量的例子

    static int global_int_static = 100;


    我们提到了作用域的问题,静态全局变量和静态函数作用域为文件作用域,也就是说,变量或函数仅在本文件中有效。这里就为我们提供了一种封装机制,如果我们想隐藏某个函数或全局变量不被外部访问,我们可以在.c文件中将其定义静态全局变量或静态函数。但是,如果在.h文件中定义了静态全局变量和静态函数,则由于#include会将头文件复制到引用点,实际上就将静态全局变量和静态函数所在的文件改变了,造成了可以在其他文件访问的假象。


    对于静态局部变量,变量仅在第一次被使用时会被初始化,之后每次进入其作用域,都会保留之前在其作用域中的运行值,也就是说生存期被延长为整个程序运行阶段,但是作用域依然是局部的。


    static是我们使用C语言做出面向对象程序的工具之一,static相关的内容比较抽象,希望大家多去了解一些。


    展开全文
  • c语言知识点

    2014-07-27 20:05:09
    1. extern在函数声明中是什么意思? 它可以用作一种格式上的提示表明函数的定义可能在另一个源文件中,但在 extern int f(); 和 int f(); 之间并没有实质的区别。 补充:extern可以置于变量或者函数前,以...

    1. extern在函数声明中是什么意思?

    它可以用作一种格式上的提示表明函数的定义可能在另一个源文件中,但在

    extern int f(); 和 int f(); 之间并没有实质的区别。

    补充:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。也就是说extern有两个作用:

    第 一,当它与"C"一起连用时,如: extern "C" void fun(int a, int  b);则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名而不是C++的,C++的规则在翻译这个函数名时会把fun这个名字变得面目 全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为 C++支持函数的重载;
    第二,当extern不与"C"在一起修饰变量 或函数时,如在头文件中: extern int  g_Int; 它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义!也就是  说B模块(编译单元)要是引用模块(编译单元)A中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量, 但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。


    2. 怎样建立和理解非常复杂的声明?例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组?

    这个问题至少有以下3种答案:

    (1)char *(*(*a[N])())();

    (2)用typedef逐步完成声明:

    1
    2
    3
    4
    5
    6
    typedef char *pc;        /* 字符指针 */
    typedef pc fpc();        /* 返回字符指针的函数 */
    typedef fpc *pfpc;       /* 上面函数的指针 */
    typedef pfpc fpfpc();    /* 返回函数指针的函数 */
    typedef fpfpc *pfpfpc;   /* 上面函数的指针 */
    pfpfpc a[N];             /* 上面指针的数组 */

    (3)使用cdecl程序,它可以把英文翻译成C或者把C翻译成英文:


    通过类型转换,cdecl也可以用于解释复杂的声明,指出参数应该进入哪一对括号(如同在上述的复杂函数定义中)。

    补充:cdecl程序非常有用,它可以在C语言的声明和英语之间进行转换。它可以解释一个现存的C语言声明,cdecl 程序可以帮助你分析复杂的声明。

    这里有一个在线的cdecl:一个在线的cdecl.


    3. 为什么struct x { ... }; x thestruct; 不对?

    C不是C++。结构标签不能自动生成类型。

    补充:也就是在C++中这样是对的。在C中不想用struct只能借助于typedef。


    4. NULL可以确保是0,但空指针(null)却不一定。


    5. 数组和指针的区别是什么?

    数组自动分配空间,但是不能重分配或改变大小。指针必须明确赋值以指向分配的空间(可能使用malloc),但是可以随意重新赋值(即指向不同的对象),同时除了表示一个内存块的基址之外,还有许多其它的用途。
    由于数组和指针所谓的等价性,数组和指针经常看起来可以互换,而事实上指向malloc分配的内存块的指针通常被看作一个真正的数组(也可以用[]引用)。但是,要小心sizeof。

    6. 当我向一个接受指针的指针的函数传入二维数组的时候,编译器报错了。

    数组蜕化为指针的规则不能递归应用。数组的数组(即二维数组)蜕化为数组的指针,而不是指针的指针。数组指针常常令人困惑,需要小心对待:

    如果你向函数传递二维数组:
    int array[NROWS][NCOLUMNS];
    f(array);
    那么函数的声明必须匹配:
    void f(int a[][NCOLUMNS]){ ... }
    或者
    void f(int (*ap)[NCOLUMNS]){ ... }  /* ap是个数组指针 */

    在第一个声明中,编译器进行了通常的从“数组的数组”到“数组的指针”的隐式转换;第二种形式中的指针定义显而易见。
    因为被调函数并不为数组分配地址,所以它并不需要知道总的大小,所以行数NROWS可以省略。但数组的宽度依然重要,所以列维度NCOLUMNS(对于三维或多维数组,相关的维度)必须保留。

    如果一个函数已经定义为接受指针的指针,那么几乎可以肯定直接向它传入二维数组毫无意义。

    7. 为什么这段代码不行?

    1
    2
    3
    char *str; 
    gets(str); 
    printf("%s\n", str); 
    str没有指向任何合法的位置,换言之,我们不知道指针str指向何处。因为局部变量没有初始化,通常包含垃圾信息,所以甚至都不能保证str是一个合法的指针。
    改正方法:用局部变量或用malloc()分配str缓冲区。

    8. 我刚才试了这样的代码char *p; strcpy(p, "abc"); 而它运行正常?怎么回事?为什么它没有崩溃?

    未初始化的指针p所指向的随机地址恰好对你来说是可写的,而且显然也没有用于什么关键的数据。
    char *p; 编译器只分配了足够容纳指针本身的内存; 也就是说,这种情况下,你分配了sizeo(char*)个字节的内存。但你还没有分配任何让指针指向的内存,因此此时p所指向的内存可能是垃圾信息也可能是可写的区域,没有崩溃说明是后者。

    9. 下面关于itoa的实现为什么是错误的?如何改正?

    1
    2
    3
    4
    5
    6
    char *itoa(int n) 
         char retbuf[20];   // error 
         sprintf(retbuf, "%d", n); 
         return retbuf;     // error 
    }
    这样在编译的时候会出现这样的警告信息“warning C4172: returning address of local variable or temporary”,说明retbuf的地址是临时变量,是暂时的,函数返回时就没有了也就是不能直接返回。

    一种解决方案是把返回缓冲区声明为静态变量:
    static char retbuf[20];

    总结:若要返回字符串或其它集合,则返回指针必须是静态分配的缓冲区,或者调用者传入的缓冲区,或者用malloc()获得的内存,但不能是局部(自动)数组。

    10. 为什么在调用free()之后指针没有变空?使用(赋值,比较)释放之后的指针有多么不安全?

    当你调用free()的时候,传入指针指向的内存被释放,但调用函数的指针值可能保持不变,因为C的按值传参语义意味着被调函数永远不会改变参数的值。严格的说,被释放的指针值是无效的,对它的任何使用,即使没有解参照,也可能带来问题,尽管作为一种实现质量的表现,多数实现都不会对无伤大雅的无效指针使用产生例外。

    补充:free()过后的指针也叫做“野指针”,建议free()过后立即将指针置为NULL,详细原因请看“为什么free(re)过后re不为NULL呢?”。

    11. calloc()和malloc()有什么区别?利用calloc的零填充功能安全吗?free()可以释放calloc()分配的内存吗,还是需要一个cfree()?

    calloc(m, n)本质上等价于:
    1
    2
    p = malloc(m * n); 
    memset(p, 0, m * n); 
    填充的全是零,因此不能确保生成有用的空指针值或浮点零值,free()可以安全的用来释放calloc()分配的内存。

    12. 在C中,sizeof('a')=4而不是1,因为C语言中的字符常数是int型,因此sizeof('a')是sizeof(int),这是与C++不同的地方。


    13. C语言中没有提高标准的布尔类型,需要用#define或枚举常数定义true/false。


    14. 我试图用ANSI“字符串化”预处理操作符#向信息中插入符号常量的值,但它字符串化的总是宏的名字而不是它的值。

    你可以用下面这样的两步方法迫使宏既字符串化又扩展:
    1
    2
    3
    4
    #define Str(x) #x 
    #define Xstr(x) Str(x) 
    #define OP plus 
    char *opname = Xstr(OP);
    这段代码把opname置为“plus”而不是“OP”。

    总结:在使用符号粘接操作符##连接两个宏的值(而不是名字)时也要采用同样的“迂回战术”。

    15. memcpy()和memmove()有什么区别?

    如果源和目的参数有重叠,memmove()提供有保证的行为。
    而memcpy()则不能提供这样的保证,因此可以实现的更加有效率。
    如果有疑问,最好使用memmvoe()。

    16. 我如何在printf的格式串中输出一个'%'?我试过"\%",但是不行。

    只需要重复百分号:%%。\%不行,因为\是编译器的转义字符,而这里我们的问题最终是printf的转义字符。

    17. 为什么大家都说不要使用gets()?

    跟fgets()不同,gets()不能被告知输入缓冲区的大小,因此不能避免缓冲区的溢出。标准库的fgets()函数对gets()作了很大的改进,尽管它仍不完善。如果真的可能输入很长的行,还是需要仔细思考,正确处理。

    18. 一个粗陋但通常有效的测试NaN的方法:

    1
    #define isnan(x)    ((x) != (x))
    C99提高isnan(), fpclassify()及其它一些类别的函数。

    附:标准C函数库的源代码:
    GNU工程有一个完全实现的C函数库(http://www.gnu.org/software/libc/

    19. 怎样判断机器的字节顺序是高字节在前还是低字节在前?

    有个使用指针的方法:
    1
    2
    3
    4
    5
    int x = 1; 
    if(*(char *)&x == 1) 
        printf("little-endian\n"); 
    else
        printf("big-endian\n"); 
    另外一个可能是用联合。

    20. 由一个日期,怎样知道是星期几?

    用mktime()或localtime()(注:如果tm_hour的值为0,要注意DST(夏时制)的调整);或者Zeller的congruence;或者这个由Tomohiko Sakamoto提供的优雅的代码:
    1
    2
    3
    4
    5
    6
    int dayofweek(int y, int m, int d)  /* 0 = Sunday */
        static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4}; 
        y -= m < 3; 
        return (y + y/4 - y/100 + y/400 + t[m - 1] + d) % 7; 

    展开全文
  • C语言函数的本质

    2021-02-01 16:19:44
    函数的本质语言为什么会有函数函数书写的一般原则函数动词、变量名词(面向对象中分别叫方法和成员变量)函数的实质:数据处理器 语言为什么会有函数 1.整个程序分成多个源文件,一个文件分成多个函数,一个函数...
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    6.3 那么,在C语言中“指针和数组等价”到底是什么意思? 6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢? 数组不能被赋值 6.5 为什么不能这样向数组赋值?externchar*getpass();...
  • 什么是Doxygen ; 他有什么作用? Doxygen一种开源跨平台的,以类似JavaDoc风格描述的文档...Doxgen可以从一套归档源文件开始,生成HTML格式的在线类浏览器,或离线的LATEX、RTF参考手册。 Doxygen 一个程序的...
  • o 2.2 64 位机上的 64 位类型是什么样的? o 2.3 怎样定义和声明全局变量和函数最好? o 2.4 extern 在函数声明中是什么意思? o 2.5 关键字 auto 到底有什么用途? o 2.6 我似乎不能成功定义一个链表。我试过 ...
  • c语言进阶之道

    2013-03-21 16:25:22
    1include包含头文件的语句中,双引号和尖括号的区别是什么? #include #incluce ""格式:引用非标准库的头文件,编译器从用户的工作目录开始搜索 双引号表示先在程序源文件所在目录查找,如果未找到则去系统...
  • 3.20 “semantics of‘’change in ANSI C”的警告是什么意思? 3.21 “无符号保护”和“值保护”规则的区别在哪里? 第4章 指针 基本的指针应用 4.1 指针到底有什么好处? 4.2 我想声明一个指针并为它分配一些空间...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.4 新的64位机上的64位类型是什么样的? 3 指针声明 3 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 3 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?...
  • 1. extern在函数声明中是什么意思? 它可以用作一种格式上的提示表明函数的定义可能在另一个源文件中,但在 extern int f(); 和 int f(); 之间并没有实质的区别。 补充:extern可以置于变量或者函数前,以标示变量...
  • 6.3 那么,在C语言中“指针和数组等价”到底是什么意思? 64 6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢? 65 数组不能被赋值 66 6.5 为什么不能这样向数组赋值?extern char *...
  • 6.3 那么,在C语言中“指针和数组等价”到底是什么意思?  6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢?  数组不能被赋值  6.5 为什么不能这样向数组赋值?externchar*getpass();...
  •  6.3 那么,在C语言中“指针和数组等价”到底是什么意思? 6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢? 数组不能被赋值 6.5 为什么不能这样向数组赋值?externchar*getpass();...
  • 《你必须知道的495个C语言问题》,作者:【美】Steve Summit,翻译:孙云、朱群英。... 6.3 那么,在C语言中“指针和数组等价”到底是什么意思?  6.4 既然它们这么不同,那为什么作为函数形参的数组和...
  • 1. extern在函数声明中是什么意思? 它可以用作一种格式上的提示表明函数的定义可能在另一个源文件中,但在 extern int f(); 和 int f(); 之间并没有实质的区别。 补充:extern可以置于变量或者函数前,以标示变量...
  • 3.20 “semantics of‘’change in ANSI C”的警告是什么意思? 3.21 “无符号保护”和“值保护”规则的区别在哪里? 第4章 指针 基本的指针应用 4.1 指针到底有什么好处? 4.2 我想声明一个指针并为它分配一些空间...
  • while (fread(cTemp, MAX, 1, f_In) > 0)//读入源文件数据直到无法输入 { fwrite(cTemp, MAX,1,f_Out);//不断写入数据 } } else if (argc == CHANGE)//如果参数个数为4,即复制文件时改变文件名 {...
  • 1.4 新的64位机上的64位类型是什么样的? 32 指针声明 32 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 32 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?...
  • 1.4 新的64位机上的64位类型是什么样的? 32 指针声明 32 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 32 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?...
  • 你必须知道的495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    1.2 64 位机上的64 位类型是什么样的? . . . . . . . . . . . . . . . . 1 1.3 怎样定义和声明全局变量和函数最好? . . . . . . . . . . . . . . . 2 1.4 extern 在函数声明中是什么意思? . . . . . . . . . . . ...

空空如也

空空如也

1 2 3 4 5
收藏数 84
精华内容 33
关键字:

c语言源文件是什么格式

c语言 订阅