精华内容
下载资源
问答
  • C语言程序设计教程笔记_编译预处理

    千次阅读 2012-07-30 17:22:56
    编译之前,预处理程序将引用程序中的预处理命进行预处理,处理之后进入编译。如图。 预处理命令是以#开头的行。这些命令放在函数之外,经常放在程序的前面,成为预处理部分。 C提供了多种预处理...


    预处理是在词法扫描和语法分析之前的工作。预处理是C的一个重要功能。

    编译之前,预处理程序将引用程序中的预处理命进行预处理,处理之后进入编译。如图。




    预处理命令是以#开头的行。这些命令放在函数之外,经常放在程序的前面,成为预处理部分。

    C提供了多种预处理功能,如宏定义,文件包含,条件编译等。

    合理使用预处理功能写出来的程序便于阅读修改移植和调试也有利于模块化的程序设计。


    宏定义


    宏定义的功能是用一个标识符表示一个字符串。编译时所有的宏名都会替换成定义的字符串。


    无参数宏:


    #define 宏名 字符串

    行末没有分号。作用域为从宏定义到源程序结束。如果要终止可以使用#undef命令。

    宏定义可以嵌套。

    宏名一般大写。


    有参数宏:


    #define 宏名(参数列表字符串

    宏名和参数表之间不能有空格。

    宏定义中的形参最好用括号。


    文件包含


    把指定的文件插入本命令行,组成一个源文件。

    在程序设计中,许多公用的符号常量或宏定义等可单独组成一个文件。

    Include""include<>有区别。<>是在目录中查找,""是在源文件中查找。

    一个include命令只能包含一个文件。


    条件编译


    本段待更新





    展开全文
  • 在实际中需要处理的数据是复杂多样的。一方面需要处理的数据量可能很大,另一方面,数据之间可能存在某种关系,比如学生学号和姓名的关系  为了简单方便地描述...构造数据类型的引入,使C语言具有更强的描述现实世

        在实际中需要处理的数据是复杂多样的。一方面需要处理的数据量可能很大,另一方面,数据之间可能存在某种关系,比如学生学号和姓名的关系

        为了简单方便地描述现实中更加复杂的数据,像其他高级语言一样C提供了用户自己定义数据描述方法:有若干个基本数据类型(元素,成员,分量),按一定的规则组成复杂数据对象,即构造类型,如数组类型,结构体类型,共用体类型。构造数据类型的引入,使C语言具有更强的描述现实世界复杂数据对象的能力。为设计更复杂的程序,解决更复杂的实际问题提供了更有效的手段。

        数组:相同类型数据的有序集合。

    一维数组 


    定义


    模式:存储类型 类型标识符 数组名称标识符 [常量表达式];

    存储类型说明:说明数组类型的存储属性,即作用域和生成期。可以是staticautoexternauto可以省略)。


    注意:


    比如:int a[4];(习惯面向对象之后可能会觉得这个定义语句别扭)

    定义数组的时候[]内必须是常量,因为在数组的长度在编译阶段就必须被确定,而变量只有在程序运行时候才能确定下来。


    数组元素的引用 


    C中数组名实质上是数组的首地址,是一个常量地址(一个地址常量或者说是一个指针常量),不能对他进行赋值,因此不能利用数组名来引用数组,只能单个引用数组元素。

    对数组元素引用时,下标可以是整型常量,变量,表达式可以是字符表达式或者枚举类型表达式。

    C的编译系统不会进行数组越界检查(笔者未经测试)。

    在实际应用中用一维数组描述一组相同类型的数据对象,以方便处理。


    存储结构与初始化


    存储结构:


    C的编译系统为数组在内存中分配一段连续的空间,每个元素占用相同的字节数。

    由于数组是连续存储在内存中的,数组名代表了数组在内存中的起始地址,而且每个元素的字节数相同,所以根据元素序号可以求得个元素在内存中的地址,并实现对数组元素进行随机存储。


    初始化:


    C允许在定义数组的同时指定初始值,这个过程叫做初始化。初始化在编译阶段完成,不占用运行时间(正因为如此所以定义数组时[]内必须是常量)。

    对所有元素赋初始值:int a[3] = {1,2,2};

    对部分元素赋初始值:int a[3] = {1};

    对所有元素赋初始值的时候可以不定义下标:int a[]={1,2,2};

    注意:若static数组或者外部数组不进行初始化,那么对数值型数组默认值为0,字符型数组默认值为'\0'(也就是NULL

      若auto数组不进行初始化,那么默认为系统分配给数组各元素的内存单元的初始值(也就是这片内存上一次使用的值)所以在不同的时间和机器上结果是不同的。

                       当给数组部分初始化的时候必须指定长度。

    案例说明数组的使用

    输入5个数,输出最大值最小值。

    #include "stdio.h"
    #define N 5
    void main(){
    int i,j,k,max,min;
    //i 循环控制变量
    //jk,最大值最小值下标识
    //max,min最值
    int a[5];
    //数组容器
    for(i = 0;i < 5;i ++){
    scanf("%d",&a[i]);
    }
    max = min = a[0];
    for(i = 0;i<5;i ++){
    if(max <= a[i]){
    max = a[i];
    j = i;
    }
    else if(min >= a[i] ){
    min = a[i];
    k = i;
    }
    }
    printf("max:a[%d]%d\nmin:a[%d]%d",j,a[j],k,a[k]);
    scanf("%d",a[0]);
    }



    二维数组


    此处待续


    数组的应用


     

    数组常用的有一下几个方面:


    数组存储数据,遍历处理


    #include "stdio.h"
    int main(){
    int sorces[100],avg,number  = 1;//成绩,平均成绩,学生数量
    int sam=0,temp,i = 0;//总成绩,临时成绩,循环计数变量
    //循环录入成绩
    while(temp >= 0){
    printf("\ninput %d :",number);
    scanf("%d",&temp);
    if(temp > 0){
    sorces[number - 1] = temp;
    number ++;
    sam += temp;
    }
    }
    avg = sam/number;
    printf("the avg is :%d\n\n",avg);
    for(i = 0;i < number-1;i++){//控制写错了
    if(sorces[i] > avg)printf("%d:%d\n\n",i+1,sorces[i]);
    }
    scanf("%d",&i);
    return 1;
    }




    数组排序


    #include "stdio.h"
    int main(){
    //选择法排序,由大到小
            //在程序设计上 ,应该有两大步:一步应该是算法的设计,一个是算法的实现(也就是用代码描述算法)。后者是程序员的基础技能,这个弄不懂或者不熟练的话,就没必要在程序员这条路上走了,这样应该也是不明智的!
            //有时候真怀疑自己是不是合适在程序员这个行业做!哎,应该很快就有分晓了。
    int a[3] = {1,2,3};//支持100个数的排序
    int temp;//临时最大值
    int n,i;//计数变量
    //排序之前显示数组
    for(i = 0;i < 3;i ++){
    printf("%d\n",a[i]);
    }
    //排序
    for(i = 0;i < 3;i++){
    for(n = 2;n >= i;n --){//将a[n]和a[i]比较,大值左移
    if(a[n] > a[i]){
    temp = a[n];
    a[n] = a[i];
    a[i] = temp;
    }
    }
    printf("\na[%d] = %d:",i,a[i]);
    }
    printf("\n--------------------\n");
    //排序之后显示数组
    for(i = 0;i < 3;i ++){
    printf("%d\n",a[i]);
    }
    scanf("%d",a);
    return 0;
    }
    



    数组查找(二分查找)


    #include "stdio.h"
    int main(){
    int a[7] = {1,2,3,4,5,6,7};//排序后的数组
    int M = 9;//查询的数
    int begin = 0,end = 6,midle;//开始和结束索引
    while(1==1){
    midle = (begin + end)/2;//中间索引
    if(a[midle] == M) {//找到了
    puts("yes");
    break;
    }
    if(a[midle] > M){
    end = midle;
    }else{
    begin = midle;
    }
    if((end - begin)==1){
    puts("no");//直到结束还没有找到
    break;
    }
    }
    puts("------end------");
    scanf("%d",a);
    return 1;
    }



    字符数组与字符串


    字符数组的定义与初始化

    略(与常规数组没有区别)

    字符串概念及其存储

    C中没有字符串类型,自然没有字符串变量。但是可以使用字符串常量,使用双引号表示。

    没有字符串类型,那么怎么存储呢?答案是使用字符数组。

    为了方便处理字符串,C规定可以直接使用字符串来初始化字符数组。

    Char s[13] = {"hello world!"};

    或者省略花括号cahr str[14] = "hello world!";

    输出输入字符串

    输出:

    Printf("%s",str);//这个不是地址么

    Puts(str)//函数原型为:puts(cahr * str);//参数为指针或者字符数组

    输入:

    Scanf("%s",str);//这种方式不能输入空格

    Puts(str)//能输入空格,原型为:char *gets(char *str),参数为指针或者字符数组

    字符串处理函数

    String.h

    复制,比较,长度,追加,截取...


    数组做函数的参数


    Void sort(int a[]){...}//形参

    Void sort(a);//实参,传的是地址


    数组是基本的构造类型,也是常用的数据类型。基本功很重要!



    展开全文
  • 指针是C的重要的数据类型,也是C的精华所在。...程序和数据在内存中的存储问题:程序要装如内存中才能运行,数据也要装入内存才能处理。内存是以字节为单位的连续的(线性的)存储空间。为了便于访问,给每个字

    指针是C的重要的数据类型,也是C的精华所在。利用指针能有效地表示复杂的数据结构,实现动态内存分配,更方便,灵活地使用数组,字符串及实现为函数间各类数据的传递提供简单便利的方法。正确而灵活的运用指针可以编写出简练紧凑,功能强而执行效率高的程序。

    程序和数据在内存中的存储问题:程序要装如内存中才能运行,数据也要装入内存才能处理。内存是以字节为单位的连续的(线性的)存储空间。为了便于访问,给每个字节单元一个唯一的编号,从0开始,递增。这些编号称之为内存单元的地址,利用地址来访问内存单元。一个经典的比喻是:把内存比作一个大楼,房间比作内存单元,房牌号比作内存单元的地址。

    变量分配存储空间的首字节地址作为变量的地址。地址就像访问存储单元的指示标,高级语言中称之为指针。在C中变量名和地址联系,编译系统会完成变量名到地址的转换。通过变量名访问内存值的方式为直接访问。通过定义一种特殊的变量来存储变量的地址,在根据此地址访问相应的内存值,这种访问方式即是简介访问。这种特殊变量就是指针类型的变量。

    指针是一种特殊的数据类型。

    指针与指针变量

    概念

    理解直接存储和间接存储的概念。

    指针用来表示一个变量指向另一个变量的指向关系。

    指针即地址,一个变量的指针即是该变量的地址。

    定义与初始化

    仍遵循先定义在引用的原则。

    定义模式:数据类型标识符 *  指针变量名

    如 : int *p;//定义了一个指向int类型变量的指针变量。

    &取地址运算符

    *指针运算符(或指向运算符,间接访问运算符)

    Int a = 5;

    Int *p = &a;

    Scanf("%d",&a);

    Scanf("%d",p);

    Scanf("%d",&*p);//3句话意思一样

    运算

    引用:两种:对指针变量本身的引用和通过指针对其所指向的变量进行引用。

    赋值运算:

    将变量地址赋给指针变量:int a,*p; p = &a;

    相同类型的指针变量间的赋值:int  *p1 = *a,*p2 = &b; p1 = p2;

    赋空值:int *p = NULL;NULLstdio.h中定义的常量。说明该指针不指向任何变量。

    除了0之外不能赋常量给指针变量。

    算数运算:

    P+=n:向高地址方向移动n个存储单元

    P-=n:...

    P++/++p:...

    P--/--p:...

    关系运算:

    同类型的指针变量可以进行关系运算。对于指向数组的指针变量,使用非常广泛。

    多级指针

    指针不仅可以指向基本数据类型,也可以指向指针变量。

    定义模式:数据类型 **指针变量名

    指针与函数

    指针作参数

    指针类型可以作为函数的参数。

    实参可以是指针变量,也可以是地址值。

    指针函数

    返回值为指针类型的函数。

    数据类型 *函数名(形参列表)

    返回指针的函数是很有用的,函数库中很多都是返回指针,比如:strcat(),strcpy()

    指向函数的指针

    变量与特定的存储单元联系,通过变量名可以得到变量的存储地址。一个函数包括一组指令序列,存储在某一段内存中,这段内存空间的地址称为函数的入口地址,通过函数名可以得到这一地址。故使用指针也可以间接访问函数。

    定义指向函数的指针变量的模式:

    类型标识符 (*指针变量名)();

    C中函数名代表函数的地址(数组名也是代表数组的地址,数组名和函数名都是常量指针)所以,函数指针的赋值为:比如int max(int,int)为一函数,那么

    Int (*p)(int,int);

    P  = max;

    调用函数两种:

    使用函数名(直接调用)a = max(m,b);

    使用函数指针调用(间接调用)a = (*p)(m,b);

    其调用模式为:(*函数指针变量)(实参类表)

    理解:

    函数指针的性质和数据指针的性质基本相同。不同的是数据指针指向内存中的数据区,而函数指针指向内存的程序代码区。因此对函数指针进行运算是没有意义的。

    C中,函数指针的意义在于实现函数的调用控制(选择性调用,就像面向对象语言中多态的概念)。当一个函数的形参是函数指针时,可以给指针赋予不同的函数地址入口,来实现运行不同的函数。

    指针与数组

    利用数组指针或者数组元素指针使用数组可以更加简便灵活。

    指向一维数组的指针

    Ca[i]用指针表示为:*a+i

    访问数组的方法各有特点:

    直接访问:直观

    间接访问(指针访问):效率高,能直接根据指针变量的地址访问指向的数组元素,而直接访问是先转换为地址在根据地址访问数据。

    注意:数组名是常量指针不能当作变量使用,比如a++a=a+1;这种是不允许的。

    使用指针访问数组不元素时注意指针当前值,特别是在循环控制结构中。

    二维数组与多维数组的指针表示法

    此处待续


    指针与字符串


    字符串的指针表示发法


    字符串保存在字符数组中:char str [] = "hello world";*(str+i)的值等于str[i];
    指向字符串的指针是字符指针(注意:是字符指针而不是字符串指针),定义格式为char *变量名;
    字符指针使字符串的操作变得简单方便灵活。C语言库函数中与字符串处理的函数大量使用了字符指针。
    例:
    Char *str = "computer";//char str[] = "computer"很像但是意义却差的很远。
    Printf("%s",str);

    例中:字符指针str中存放的是字符常"computer"的首地址,指向的是字符常量"computer"的首字符。而不是把整个的字符串赋给 了str,虽然可以使用格式输入输出它。


    字符串数组


    此处待续


    指针数组与命令行参数


    此处待续




    展开全文
  • 指针的本质是某种变量的地址,他的核心优势是在程序运行中减少寻址的过程,因为当使用一个变量的时候应该先按照变量名找到这个变量的地址( & 变量名的过程),然后在针对内存中的数据进行操作。但是如果使用指针的...

    实际应用中会有一些不同数据类型组成的数据实体,这些不同的数据类型的数据项是相互联系的,应该组成一个有机的整体。如果用单独的数据项来表示,就不能体现数据的整体性,不便于操作。

    C中使用结构体这种数据类型表示这种数据实体。结构体中的数据项称为成员。


    结构体类型的定义


    模式为:

    Struct 结构体变量名 {

    成员变量类型 成员变量名;

    成员变量类型 成员变量名;

    ...

    }

    注意:结构体是用户自定义的类型,与系统定义的基础数据类型一样可以定义变量。

    //可见类型这个概念不只是面向对象语言的专利

    结构体的成员类型可以是结构体类型,但不能定义自己类型的成员。//这和类的概念不同


    结构体类型变量


    定义


    三种方法定义结构体变量

     1.先定义结构体类型在定义变量。

     2.定义结构体同时定义变量。

     3.直接定义结构体变量。


    使用


    引用一个结构体变量有两种方式。

    1.直接引用:使用变量名引用,使用“.”符号引用。

    2.间接引用:使用指向结构体的指针引用,使用“->”符号引用。


    变量的初始化

    A = {123,"张三",'f',"**学院"}



    结构体类型数组


    定义:

    struct student students[80]; 

    初始化:

    students = {{123,"张三"},{124,"李四"},{...}}

    使用:...


    结构体类型指针


    指向结构体变量:


    Struct 结构体类型 *指针变量名


    指向结构体数组元素:


    同数组指针


    结构体和函数



    结构体变量作为函数参数


    老的C标准不允许把结构体变量当作参数传递,只允许传递结构体变量的指针作参。新的C标准和编译系统都允许使用结构体变量作为参数传递。


    指向结构体变量的指针作为函数参数


    把一个完整的结构体变量作为参数传递虽然合法,但是要将全部成员值一个一个传递费时间又费空间,开销大。如果结构体类型中的成员很多,或者有一些成员是数组,则程序运行效率会大大降低。这种情况下使用结构体变量的指针作为参数传递能提高效率。


    函数返回值为结构体类型


    此处待续


    自己的理解:


    结合结构体理解指针:指针的本质是某种变量的地址,他的核心优势是在程序运行中减少寻址的过程,因为当使用一个变量的时候应该先按照变量名找到这个变量的地址(&变量名的过程),然后在针对内存中的数据进行操作。但是如果使用指针的话,就减少了寻址的这个环节。大大节省了程序运行的时间和空间。


    改正:[

    指针是有省略寻址的优势,但这不是它的核心。指针的核心优势应该是使程序能对某一个内存空间直接进行操作,特别体现在函数才传参上。一个函数接受常规变量的传入参数,则只能对此函数周期中的形参进行操作,而不能改变实参的值。而当你传入一个指针类型的变量参数时,则可以直接操作实参。这是指针的意义所在。

    int f(int b) /*b为形参*/ 

    { return b;} 

    main() 

    {int a=1; 

    printf("%d",f(a));/*a为实参*/ 

    }

    ]


    结构体的概念:因为是先学习了面向对象的语言java所以对对象的概念比较熟悉。C中的结构体类似java中类的概念,二者的本质相近,都是为了封装。只不过java中的类除了封装数据之外还封装了操作(方法),C中的结构体只是封装了数据。另外C中的结构体不能拥有本类型的成员,这个是和java中类的概念不同的。









    展开全文
  • 公用体和结构体一样,是用户自定义的数据类型。 共用体数据类型与共用体变量 ...在某些应用中要求某个存储区域中的数据对象在程序执行的不同时间能存储不同类型的数据。公用体为了这种需求而生。
  • 计算机程序涉及两个基本问题,一个是数据的描述,一个是动作的描述。 程序的主要任务就是对数据的处理。 数据以一定的数据形式存储,存放情况由数据类型决定。 C有4种基本数据类型...
  • 单片机C语言程序设计
  • C 语言设计 学习笔记 早晨 06:40 起床 07:20 08:20 英语 1 小时 新概念英语单词语法听读背 大学英语单词...Intel 微处理器结构编程与接口 深入理解计算机系统 80x86 汇编语言程序设计 8086-8088 宏汇编语言程序设计教程
  • C 语言设计 学习笔记 早晨 06:40 起床 07:20 08:20 英语1小时 新概念英语单词语法听读背 大学英语单词...Intel 微处理器结构编程与接口 深入理解计算机系统 80x86 汇编语言程序设计 8086-8088 宏汇编语言程序设计教程 B
  • 0417、C语言程序设计及应用实例.rar
  • C语言程序设计教程>> 第三版 谭浩强 张基温著 第八章 文件 读书笔记 //写一个字符到磁盘文件// int fputc(int ch,FILE *fp)//ch 要写入文件的字符,,fp:FILE 类型文件指针//功能:把字符变量的值输出到指针...
  • 参考书:《C程序设计教程(第二版) 谭浩强著》 指导老师:伟峰潘 一)  1、C语言源程序描述时应注意以下几点:  ·C语言源程序的扩展名必须为.c。//.cpp为C++的扩展名,C++完美兼容C,所以我们现在用的其实...
  • C语言设计教程学习笔记_序言

    千次阅读 2012-07-30 16:40:31
    之前只是学习过java这一门...就学习经验来说,学习程序设计语言,无非就是两个原则,一个是多看,一个是多写。只要这两个原则不触犯,应该就不会出太大的问题。 本系列博文以杨路明先生主编的《C语言设计
  • 全国计算机等级考试二级教程——C语言程序设计(2008年版).北京:高等教育出版社,2007. 因为马上要参加2级C的考试,所以学习主要以上面提到的书籍为主。不过在学习过程中遇到的大大小小的问题还是会查阅各种资料...
  • 全国计算机等级考试二级教程——C语言程序设计(2008年版).北京:高等教育出版社,2007.[3]姚合生.C语言程序设计习题集、上机与考试指导.北京:清华大学出版社,2008. PS:[1]不可能全部看完了,那就放弃吧,现在...
  • C语言设计教程笔记_概述

    千次阅读 2012-07-20 16:54:41
    1 程序与程序设计语言 基本概念 为了让计算机按照人的意愿处理事物,必须设计程序并预先把它放在存储器中(程序的本质是一系列指令的集合)。 ...
  • 零散知识点 模块化:将一个问题分解成若干个子问题的过程成为模块化。 模块化的优点:不但可以将一个复杂的问题分解成几个相对简单的问题;...函数调用原则:C语言中规定,所有函数必须“先定义后使用”。即...
  • 变量 :C语言中,每个变量必须先定义后引用。所谓变量存在是指系统为这个变量分配一块存储空间,此时对变量的操作,就是对变量所对应的存储空间中存放的数据进行操作。人们将变量占据存储空间的时间称为变量的生存期...
  • 软件需要设计、开发,但不是传统意义上的产品制造; 软件不会磨损,但软件需要维护,即:修改代码或增加模块; 虽然软件行业正在向基于组件的组装方式发展,但是大多数软件仍旧需要定制 软件的生命周期 ...
  • 程序设计是指从确定任务到得到结果、写出文档的全过程,一般经历一下几个阶段: 1.问题分析 2.设计算法 3.编写程序 4.对源程序进行编辑、编译和连接 5.运行程序,分析结果 计算机语言 1.计算机语言就是计算机...
  • 字符串处理 功能描述:从键盘输入一个文本行后,为用户提供菜单选择,实现字符串一些操作——显示文本行、查找并替换指定子串、删除指定子串、统计指定子串数目。 实现代码: ... 4 #pragma warning...
  • 0416、单片机的C语言应用程序设计电子教案.rar
  • 可以降低程序设计的复杂度;可以提高程序的可理解性。 定义联合体的语法格式: union <联合体类型名> {  <成员列表>; }; 枚举类型 特点:在定义类型的时候将所有可能的取值一一列举出来,这种类型的...
  • 作者:sumjess目前内容:第十二、十三章总结1、C语言中的用户标识符的作用域和存储类:C语言之局部变量&amp;全局变量&amp;变量存储方式全局变量与局部变量在内存中的区别详细解析2、编译预处理: (1)在...
  •  ③在C语言中,所有的实型数的运算符均以双精度方式进行。若是单精度,则在尾数部分添0,使之转化为双精度数;  (2)算数运算符的优先级:  (3)强制类型转换表达式:  形式: (类型名)(表达式)  eg: 表达式...
  •  若以下程序放在myc.c文件中,在编译连接后,生成一个myc.exe文件,输出argc和argv中的数据。 #include <stdio.h> main(int argc,char *argv[ ]) //main(int argc,* *argv)与前面一样 { int i; printf("argc=%d...
  • 自学零基础入门新版C语言视频教程是2020年2月录制,分为14章72集 【基础知识点】 讲解C语言的发展史和C语言的快速启蒙 快速搭建C语言开发环境和手把手教你编写第一个程序 详细讲解C语言基础...
  • 若同时读取多个值,在执行程序输入时,可用空格或\0 断开;  ④ 可在%和格式字符之间加上*号,作用是跳过对应的输入数据; 3、关系运算和逻辑运算:  (1)C语言6种关系运算符:>、<、==、>=、、!= ,前四个优先级...
  • 声明:本篇文章只是个人知识盲区、知识弱点、重点部分的归纳总结,望各位大佬不喜勿喷。梳理顺序是按照书籍的实际顺序梳理,转载请注明出处。作者:sumjess目前内容:第六七章总结1、转义字符(又称斜线字符): ...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 187
精华内容 74
关键字:

c语言程序设计教程笔记

c语言 订阅