Chinaunix首页 | 论坛 | 博客
  • 博客访问: 127967
  • 博文数量: 36
  • 博客积分: 2092
  • 博客等级: 大尉
  • 技术积分: 390
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-04 17:33
文章分类
文章存档

2011年(18)

2010年(18)

我的朋友

分类: C/C++

2010-05-09 12:57:42

今天有几小时看了电子书简体还不错.就做个笔记:
好书介绍:
c程序设计语言,C primer Plus,c和指针,c 陷阱与缺陷,c 专家编程,c 语言编程觉问题解答,c/c++ 嵌入式系统编程, 嵌入式实时操作系统,

嵌入式系统构件,后三本都是偏向嵌入式进攻的,嵌入式系统编程在看.还是有点糊.没办法.新手,Keep up 加油!

一些小测验,还真有意思.蛮不错!
如:用变量a给出下面的定义
一个整型数                 int a;
一个指向整型数的指针          int *a(记得星号与变量紧跟)
一个指向指针的指针,它指向的指针是指向一个整型数          int **a;
一个有10个整型数的数组             int [10]
一个有10个指针的数组,该指针是指向一个整型数的    int *a[10]   别写成int (*a)[10] 这样就成了数组的指针了!
一个指向函数的指针,该函数有一个整型参数并返回一个整型数               int (*a)(int) 别写成int *a[10] 这样就成了函数的指针了

!
一个指有10指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数         int (*a[10])(int)

不感觉到它的指引吗?是一步一步往上教,让人容易明白,清楚! 这就让我明白指针的初步用法!

我们再来一个const 常量,它与#define 和static 不有同!
不同,我菜鸟理解:从时间期上看是相同的,那就看它定义到哪作用域!const 有类型,#define 可理解成(别名),没类型,static 静态!
                const 它的值不能修改,它只用到定义到全局,能清楚明白这变量的用意,和用到指针和参数上!
                例如:const int a;与int const a;它们的作用意思是一样的,A都是一个常整数!
                     const int *a 与int *const a; 可能看上去是一样的,其实否定的.前者是,指向常整型数的指针,简单而言是它的整

型                     数是不可以改的,只有能改是的指针!后者就相反,整数能改,指针不能改,如果这样int const *a const/const int

                    const *a ,那它就前后者的结合,什么都不能改!

                static 如果定义函数中,它的调用过程中值是不变的,在函数体外,其它模块外的不能访问!

了解下它的优点:它就只有32个关键字,9种控制语句,34种运算符. 使用起来.也很灵活,方便!
               它的32个关键字分别是:数据类型12个:char,double,enum,float,int long,short,signed,struct,union,unsigned,void
                                    控制12个:break,case,continue,default,do,else,for,goto,if,return,switch,while
                                    存储4个:auto,extern,register,static
                                    Other 4个:const,sizeof,typedef,volatile
                其实没必要去背,慢慢就用到,说说他们:数据类型,就不用说了吧,不就是数据的类型咯,控制,它能组成9种控制语句,      

         如:if..else..;for()....;switch...case...;defaule;等等,存储,它就是变量的时间域和作用域!Other 就是其它咯,解释       

        还真广,慢慢体会!


它的语句,就是表达式,后面加";"例如:a=5 这是赋值表达式,a=5;这样就构成语句了!我们了分清楚= == .别让人思想糊乱@_@!
它可分分,控制语句,就刚说的9个语句;表达式语句,你别说忘记了噢,刚说了;空语句,就是只有";"占用一行,很少这样做;复合语句,就在花括

号内括起来{},里面可以再嵌入!

程序的文件结构,它就由若干个C文件,每个C文件包含若干个函数;若干个头文件,它包括一些数据结构和定义和函数的原型;若干个库文件;一

个或多个MAKE文件,Make文件描述了多个文件中的依赖关系以及生成最彖可执行文件或库文件所需要的信息(我还有点不太了解,昨天看了

Linux下的C编程讲了整个过程,讲到MAKE,它不就是项目管理工具(make).然后用到Makefile和sutoconf和automake 生成Makefile,都搞得我糊

了,到时我也把笔记与大家分享,也当自己复习的好地方)

我们来理解数据类型,如常量与变量:常量其值不可改变,常量(就刚提到的const,#define,常量名为大写);
                   变量(标识符),可以改值,变量名只能由字母,数字.下划线组成,并且第一个变量名字符只能是字母或下划线!
        整型数据表示方法:十进制就我们常用的123数字;八进制以O(数字)开头,0123;十六进制以0x开头,0x123/0x1e(指数方式);我们也理

                 解它们占用的字节,如整型变量分为:int short,long和unsigned;int 2字节,long 4个字节,(不同机器,也会不同!)
       实型数据表示方法:自然就是浮点数,如:0.12,.123,123.0.0等,也可以用指数:123e3,它代表123X10的三次方;float 占4字节,7位小数

              有效数字,double 占8字节,15-16 位小数有效数字;
       字符数据表示方法:字符变量就是用单引号括起来,如'a''b''\n''\t',都是由char来定义,它只能存放一个字符常量;字符串就用双引

号               括起来的,"a""fda",它与'a'不同,因为字符串会在后面加'\0'来代表字符串的结束!@
讲了数值类型,就看看他们的数值型数据间的混合运算.顺序表是:char,short->int->unsigned->long->double<-float

学了数据类型,就到运算符和表达式:有算数运算符,关系运算符,逻辑运算符,条件运算符等,注意要他们的优先级!如果我们不清楚运算符的优

先级,最好的办法是用括包,一一括起来!

我们刚说了控制语句,可以再分开来学习:如,条件控制语句和循环控制语句;
循环语句有:goto(最好不要用,现在也很少使用了),while()..,判断再执行;do...while()执行再判断;for()..;可用break和continue来跳出

循环;break 用于跳出循环;continue用于结束本次循环!
条件控制有:if()..else;switch() case ...;

函数.我们要注意形参和实参的说明:在函数被调用之前,形参是不占内存的;实参可以是常量与变量或者表达式;必须指定形参的类型;实参与

形参类型也应该一致;实参对形参的数据传递是值传递,单向传递!
我们例子一个:
int func(int c)           //形参
{
    int a,b;                     ^
    scanf("%d%d",&a,&b);         |单向传递
    return (a>b)?a:b;            |
}                                |
int main()
{
    int c;
    func(c);              //实参
    printf("%d\n",d);
    return 0;
}
   
调用函数有几点注意:在函数调用时,实参和形参的的个数,类型应一一对应,对实参表求值的顺序是不确定的,有的系统按自左到右,有的自右

到左的顺序;函数调用,如果主调函数和被调函数在同一文件中,被调函数在主调函数后,那么一定在主调函数前进行声明.除非,被调用函数的

返回值类型为整型或字符型,或者出现在主调函数之前;c语言允许函数递归调用,在调用一个函数的过程中又出现直接或间接的调用该函数本

身(递归哪些可以自己去看看书)!

还记得我们刚说的时间域和作用域吗?不记得,看看前面,变量可分为时间域和作用域角度来看作用!
时间域可分静态与动态.作用域分为全局与局部;
局部变量:就在一个函数内定义,只在函数范围有效;
全局变量:定义在函数外,其它函数能调用,模块外的,就可用extern(外部)声明(在定义之前面加)!
静态指在程序运行期间给变量分配的存储空间,动态指程序运行期间根据需要动态的给变量分配空间;
静态和动态分别包括|:auto(自动的),static(静态),register(寄存器),extern(外部)

预处理:包括宏定义:#define 标识符
         文件包含:#include <文件> /#include "文件"   区别:""表示在工程目录找.找不到,再按系统指定的标准方式去检索;<>就直接按

                 系统标准方式检索目录!
         条件编译:#ifdef 标识符 程序1 #else 程序2 #endif 如果标识符在前面已定义过,则对程序1编译,否则编译程序2
                  还有#ifndef 标识符 程序1 #else 程序2 #endif 与前面刚好相反.定义过,就对程序编译程序2,否则1
                  还可以#if 表达式 程序1 #else 程序2 #endif 如果表达式为真,则对程序1编译,否则编译程序2

最后讲讲指针:指针就是地址.指针变量就是用来存放指针的变量!
我们不要被一些读法误会:
变量的指针:          int *p;    就是被定义为指向变量的指针意思
指向变量的指针变量: int *p;   p才是指向变量的指针变量
还用什么的数组的指针和指向数组的指针变量;字符串的指针和指向字符串的指针变量;函数的指针和指向函数的指针变量;

要讲的是字符串的指针和指向字符串的指针变量:字符串就有两种表示形式:一种是数组,一种是字符指针.
char string[]="i Love C"和char *str="I love C" 其实指针也是在内在中开辟了一个数组,只不过数组的首地址存放在字符指针变量str中

!
她们的区别:字符数组由若干元素组成,每个元素存放一个字符,而字符指针变量只存放字符串的首地址,不是整个字符串!对数组初始化要用

static,对指针变量不用static char string[]="i Love c"!;
对字符数组赋值,只能对各个元素赋值,而指针就可以:
char    str[15]; 而指针就可以 :     char *str;
str="i Love C"                        str="i Love C"

指针数组:指针数组多用于存放若干个字符串的首地址,注意一点,在定义指针数组时初始化:static char *name[]=

{"YI","BU","YI","TIAN","KONG"};不要以为数组中存放的是字符串,它存放的是字符串首地址.

指向指针的指针:就是将指针再用一个变量来存放,这个变量就是指向指针的指针:char **p;
如果使用void指针,就一定用到的时候要强制转换!
如:char *p1;void *p2;
   p1=(cahr *)p2;

其实以上都是一些概念,我们还要去学习,去实践,才能更易明白和掌握!
哗,都一点多了.睡了.明天再发!

阅读(1114) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~