您的位置:首页 > 编程语言 > C语言/C++

C语言快速学习(1-100)

2016-06-17 18:03 309 查看
1.C语言的注释:
#if 0
    statements
#endif
2.预处理指令:

相当于是把头文件 包含的内容赋值到了引用文件的里面。TIPS:如果有一些声明需要在不同的源文件中,那么可以在一个文件中单独编写这些声明。
#define 后面要大写,相当于是这个字符就是所代表的数字
3.函数原型:相当于是在代码刚开始时去声明所用的函数有些。
4.传参:所有的传递的参数都应该是值类型的。
5.字符串:就是以NUL字节结尾的字符,NUL字符串终止符
6.格式指定符:%d,%o,%x等
7.scanf &:在参数为值类型的时候必须要在前面加上&,而如果是数组就不需要添加这样的符号,但如果只是数组里的某一个成员,那还是需要添加&符号的
8.C语言一般情况下是不会检查数组下标越界的,所以这里需要自己写代码来防护。
9.EOF:EOF是一个int类型的;字符只是小整型数,而一个整型类型是足够可以容得下一个字符类型的。
10.当数组名作为参数时,传给函数的实际上是一个指向数组其实位置的指针,也就是数组在内存中的地址。
11.在形参中加入const就是为了表示传进来的实际参数是不能被修改的。
12.转义字符使用的注意事项:? “ ‘ \ 最好使用转义字符
13.char 在不同的机器上所代表的范围可能不一样,所以只有unsigned 和signed才能使程序可移植
14.整型字面值,声明const的变量,初始化后便不能改变。
15.字符常量的类型总是int型。
16.如果一个多字节字符常量前面有一个L,那么它是宽字符常量。
17.枚举类型:

enum DAY

{

      MON=1, TUE, WED, THU, FRI, SAT, SUN

};

(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。

(2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。

(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。

(4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。

(5) 枚举型是预处理指令#define的替代。

(6) 类型定义以分号;结束。

18.指针:计算机内存就好像一条街区,里面会有许许多多的门牌号唯一的房间(指针),里面会有具体的东西。

19.字符串:字符串是一NUL结尾的一个字符数组,即使空的字符串,都会以NUL结尾。

20.字符串常量尽量不要随意修改,如果要修改字符常量,就将她们存储在字符数组中。

21.signed 声明一般情况下用于声明Char,因为其他的都是有负值的。

22.C语言编译器不会校验下标是否越界;关注下标值的来源,再对下标的防护做预判和选择。

23.使用隐式声明不是一个好的编程风格,而使用显式声明较为明确的显式出定义的内容和范围。

24.typedef:这是一个定义 指针类型的变量 typedef 为指向字符的指针类型的新名称,新的类型名用typeof

25.常量:const 就是不能改变的值,赋初值要么是在刚开始时赋初值,要么是作为形参和实参来赋值。

26.指针常量:

int const *pci;     指向常量的指针,可以修改指针的值,但是不能修改它所指向的值
int * const pci;    指向整型的常量指针,指针是常量,不能修改,但是可以修改它所指向的整型的值
int const *const pci;  两个都是常量,都无法修改。
27.define 是要优于const的,因为define 可以在常量的地方进行赋值,而const只能在变量的地方进行赋值。
28.代码作用域:内层变量的名称应当与外层变量的名称不一致(可以但不建议使用)
29.C语言的形参的作用与位于最外层,也就是说如果在最外层定义一个名称与形参相同的情况是不被允许的。
4000

30.文件作用域:类似于引入的头文件,define 这样的变量会一直在程序结束之前都保持,不会被删除。
如果某个声明在正常情况下具有external链接属性,在它前面加上static关键字可以使它的链接属性变为internal。
static int b; 

static只对缺省链接属性为external的声明才有改变链接属性的效果。
31.extern 和static 在第二次赋值的时候,不会被附上心得属性。
32.存储类型:静态内存,静态变量(程序运行之前创建,中间一直存在)
33.在函数内的是自动存储,自动存储的变量是在函数内产生在函数结束时消失,循环的情况会多次执行,注册再注销
34.形参不能为静态,因为实参在堆栈中传送,所以不能用static/自动变量在堆栈中、static不存储在堆栈中。
35.register 变量:提示将被存储在寄存器中,但编译器可能会不处理。(寄存器中的效率较高)。
36.C语言没有赋值语句,只有表达式。
37.C语言里没有布尔值,所以C语言是用表达式来完成判断的,零值为假,非零值为真。
38.if-else中的判断是else属于最靠近它的不完整的if语句。
39.break和continue之间的区别;
40.while语句有时循环体内部就可以完成循环功能,不需要执行循环内容,就去使用空的循环语句。空的最好另起一行然后添加分号。
41.for循环相比较于while循环而言,操作循环的表达式收集在一起,放在同一地点便于寻找。
42.do语句的循环体至少执行一次,先执行循环体,然后才会执行判断条件。
43.其实在switch和break语句中的最后一句是没有必要加break的,但是为了后期维护的需求可以增加break语句
44.switch语句中没有必要选择continue
45.
这样的表达式可以使得在多种情况下执行一种操作。
46.增加一个default语句,当所有的case都无法满足时,会执行default语句,好习惯是增加一个default
47.移位操作(左移位和右移位)无符号的数的移位都是逻辑移位,而有符号数的移位是逻辑还是算数移位,取决于编译器,所以有符号数的移位是不可移植的。
48.移位操作不能出现负值的情况,因为机器会乱整(移位不要超出数字的本身位数)。
49.尽量少使用内嵌赋值操作表达式
50.getchar 返回值为整型值而不是字符值,整型值的范围是要大于字符型的,如果用char来存储的话,就会将字符给截取。
51.应该尽量使用复合赋值符号。
52.单目操作符:

!:执行逻辑反操作;如果操作数为真,其结果为假;如果操作数为假,则为真。

波浪线:求补操作,原先为0变为1,原先为1变为0
&:&a取变量a的地址。(取地址)
*:间接访问操作符,用于访问指针所指向的值。(取值)
sizeof():判断操作数的类型长度,例:sizeof(int)
sizeof x.注:判断表达式的长度,不需要对表达式赋值 sizeof(a=b+1);a并未赋值。
():强制类型转化;
53.++和--符号的前缀赋值和后缀赋值都是会将变量的值拷贝。例:++a=10;++a是a值的拷贝,并不是a的值
54.关系操作符:>,>=,<,<=,!= 关系操作符返回的结果是整型值。
55.if(!expression)语句是这样考虑的,因为!符号的优先级较高所以如果表达式里面还有符号,那么就需要添加括号来区分。
56.在C语言里面一定要区分一下“=”和“==”号的区别
57.逻辑操作符:&&和||都是短路求职,只要第一个表达式能够确定,那么久只需要第一个表达式求值而第二个表达式不需要求值。
58.逗号表达式每次采用的都是计算出表达式的最后一个的值
59.布尔值:零则为假,任何非零的值都为真。
60.左值和右值:左值必须是一个位置精确的值。
61.隐式转换:C整型算数运算总是至少一缺省整型类型的精度来进行的,表达式中的字符型和短整型操作在使用之前被转化为普通整型。这种转化被称为是整型提升。执行完运算以后会再截取。
62.算数转化:
int a=5000;
int b=25;
long c=a*b;(wrong)---------long c=(long)a*b;
整型——float(只要求6位数字精度)超过6位给float 就会取得近似值,float转化为int型时,如果浮点数的值过于庞大,无法容纳于整型值中,结果就会未定义。
63.不要过度依赖于运算符的优先级,最好用()来分清运算的顺序以及优先级
指针
64.内存中每个位置由一个独一无二的地址标识。
65.内存中的每个位置都包含一个值。

硬件还是通过地址来访问,高级语言编译器会通过名称来访问地址。

举例表明指针的用法:

int a=112,b=-1;
float c=3.14;
int *d=&a;           //*d获得了a的地址的值;所以*d的值为*d地址里存放的值为112;d的地址没有发生变化,所以值仍然为100;
int *e=&c;

值为该值所在地址里面的值,这样的话包括指针也不例外。
*:就是取地址中的值,所以*号后面跟随的就是地址。(取值)
*:就是复制一个地址的值,*号后面的值被赋值为取出地址的值。
67.对于指针进行间接访问之前要确保指针变量已经进行了初始化
68.NULL指针,不指向任何的内容,可以在初始化的过程中使用;
注:1.用NULL来赋值的时候,不能用此来即作为状态位的判断又作为指针指向的判断,应该再设置一个状态位
       2.在使用指针值的时候,应该加一层判断来判断指针是否为空值。
69.指针在间接访问时,要注意整型值和指针类型的访问,不能随意混用
70.没有人会使用*&a这样的表示方式
71.指针常量:*(int *)100=25;这里使用了一个强制转化,将100这个整型数字转化为指向int类型的指针值。
72.指针示例:
程序1:求字符串的长度:

#include "stdafx.h"
#include "stdlib.h"

size_t
strlen(char *string)
{
    int length=0;
    //while(*string++!='\0')//*string可以获取的char类型的第一个字符,指针一个个往下加直到加到位空的位置
    while(*string++!=NULL)//在这里'\0'和NULL是一致的。
    {
        length+=1;
    }
    return length;
}
int _tmain(int argc, _TCHAR* argv[])
{
    char *a="xwxwxsxsxws";
    //char q="dwedwe";char值的情况只能是字符,而不能是字符串,只有使用指针以后才能够用char来存储字符串
    int i=strlen(a);//这里的值为11,及字符的个数
    getchar();
    return 0;
}
73.指针的算法并不依赖于指针的类型
74.指针可以通过加法和减法来实现访问上一个和下一个,但是不能超出最大值和小于最小值
75.指针相减是为了计算出两个指针内存之间的距离,(但是不能指向两个不同对象的相减;类比:不同街道的房子的门牌号相减不能计算出之间房屋的个数)。
76.在进行指针计算的时候,一定要估计好指针下标是否越界,这些都需要程序员来防护。

77.指针的关系运算:指向同一个数组类型的时候,可以比较哪一个指针指向的更加靠前,哪一个指针指向的更加靠后。
78.return返回值,没有返回值的话就会隐式的返回一个值,但是都需要在函数方法上用void
79.函数原型:申明函数原型可以规范后续使用函数时参数一致问题,返回值一致问题。
80.函数原型的作用与要弄清楚/最好给函数原型写有意义的参数名称。
81.函数原型最好的方式是写一个头文件,在这个头文件中完成函数原型的相关定义。
82.没有函数原型,函数的返回值就会被认为是一个整型,从而引起很多错误。
83.C语言里的传参值使用的只是一份拷贝,所以不会改变传递来的参数的值。
84.数字是传值调用,数组是传址调用(会访问到原先的数组,并且会有所修改,相当于C#中的var元素)。
85.ADT和黑盒:类似于C#里面的封装接口。
86.C语言里的递归实现:

在递归里就是一层一层的向栈顶添加元素,然后打印的时候在一层一层的从栈顶将元素取出来,然后销毁栈顶的变量,一层一层的向下销毁。

87.递归所需要的两个特性:1.存在限制条件,当达到这个条件以后,递归便不再继续
                                           2.每次递归调用之后就越来越接近这个限制条件
88.递归算法运行时的开销:参数必须压到堆栈中,为局部变量分配内存空间,寄存器必须保存等。
89.迭代计算:(Fibonacci)额外i开销巨大:
注:当使用递归方法实现一个函数之前,一定要考虑函数带来的开销,开销可能是几何倍增长的。
90.可变参数列表:函数原型中未定义函数参数的个数以及类型,所以要用到可变参数列表。
91.stdarg宏
92.数组的名称,就是一个指针,指向数组的第一个元素,如果数组的第一个元素是int类型,那么该指针就是指向int类型的数组。
93.数组名称是一个指针常量而不是一个指针变量
94.sizeof()这个函数是用里面调用数组名的话,此时的数组名便不再是指针。而是返回数组里面元素的个数。
95.数组a[10],&a[0]:其中a[0]的值为第一个元素的值,&是取值返回一个指针类型的值。所以&a[0]表示的是取a的第一个元素的地址,返回一个指针类型的值。所以&a[0]与a表示的含义相等。
96.a,b分别为两个数组,不能出现这样的表达式即a=b;
97.数组名称是指针常量,原则上是不能出现在等号左边的,即不能当作一个左值来处理。
98.*(b+3)表示的是指针向后移若干位。通过移位来指定不同的位置
99.除优先级以外,数组下标的访问和指针的间接访问作用是一致的。
100.这两个表达式的含义是一致的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言