世纪电源网社区logo
社区
Datasheet
标题
返回顶部
讨论

C语言笔记

[复制链接]
查看: 1133 |回复: 0
1
xinkaishi
  • 积分:392
  • |
  • 主题:83
  • |
  • 帖子:98
积分:392
LV4
初级工程师
  • 2017-8-2 16:31:29
1973年,美国贝尔实验室的D.M.Ritchie(丹尼斯·里奇)在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言,并首次用C重新实现了UNIX操作系统。
★1978年Brian W. Kernighan和Dennis M. Ritchie出版的名著《C程序设计语言(The C ProgrammingLanguage)》,常被人们称为K&R版C教材或“白皮书”,为C语言的推广普及立下汗马功劳。在书籍方面我还要极力推荐的一本精典著作就是《C和指针》,写的特别深入、详细。
1、C语言是一门兼具高级语言功能和低级语言大部分功能的程序开发语言,所以既能开发应用软件也能开发系统软件。
2、C程序是由函数构成的,一个C源程序至少且仅包含一个main函数。一个C程序总是从main函数开始执行的,而不论main函数在整个程序的位置如何。main(int argc,char *c[])主函数也可以带参数,此时在命令行执行test.exe ma wen tao,那么总共有三个参数,argc就等于3,c[0]是源程序名"test.exe",c[1]是ma,c[2]是wen,c[3]是tao。
3、C语言是严格区分大、小写的,比如定义变量时:int a和int A是两个完全不同的变量。
4、C语言中整常数可以有3种表示形式:
  (1)默认为十进制。
  (2)以0开头为八进制,如:0123表示八进制123,十进制为83。
  (3)以0x开头为十六进制(没有直接表示二进制格式,所以可以用十六进制表示),如:0x123。
5、数据类型的长度由编译器决定,比如Turbo C给int型变量分配2个字节的存储单元,而Visual C++6.0则分配4字节。
  ★这里简单说下C语言变量在内存中的存储位置:
   (1)全局变量和静态变量都在静态内存区,说白了也就是普通内存区即进程所分配的地址空间,当程序退出自动释放。
   (2)函数的参数和局部变量都在堆栈中,函数退出后这些变量都会自动出栈,即释放内存。
  (3)用malloc、calloc、realloc分配的内存属于堆区,必须手动调用free函数释放,否则会造成内存泄露。
  (4)寄存器变量,直接存储在寄存器中,存取值速度快,只有局部自动(非静态)变量和形式参数可以这样定义。如:register ...
6、整数默认就是有符号数,浮点型常量默认为双精度,有些编译器比如Turbo C把字符型变量默认定义为signed char型,即有符号字符,这样它的范围就是-128到127之间了,但有些编译器默认字符是无符号(unsigned char)的,范围在0到255之间。
7、%模运算符(求余数)两侧均应为整型数据。
8、变量使用前必须先声明,而且声明要在代码之前(即变量声明紧随代码块左大括号)。
9、关系运算符(<,>,<=,>=,==,!=)的判断结果有真,假两个值,真值用非0表示,假用0表示,没有true和false等关键字。
   C语言的逻辑运算符(&&,||,!)与、或、非的判断结果是假则值为0,结果为真则值为非0(包括任何非0数)。
10、逻辑表达式在求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符后才能确定表达式结果时才执行后面运算,比如:a&&b&&c如果a为真(非0)才去计算b,如果a为假(0)则b和c都不会去执行,最终结果就是假。
11、if语言的判断条件是一个关系表达式或逻辑表达式,由于逻辑表达式的真用非0代表,所以if语句的判断条件可以是0和任意非0数值,包括(整数、实型、字符型、指针型),如:if(3)   printf("0k");或者if('a')printf("no");都是合法的。切记即使在条件判断和循环判断中传的是负数也会为真,即 if(-2)...while(-1)等等这样的表达式都会为真,只要不是0就为真。
12、条件表达式即三目运算符x?a:b中a和b的结果类型不同,则三目运算符的最终结果会取类型较高的,比如x>y?1:1.5,如果x>y为真则最终结果为1.0。
13、for循环中for(表达式1;表达式2;表达式3),都可以省略这样就成了死循环,但分号不能去掉。而且表达式1和表达式3中都可以包括多个表达式用逗号分隔如,比如:
    for(i=1,j=2; i<100; i++,j++)。
14、while循环、do...while循环和for循环可以用break语句跳出循环,用continue语句结束本次循环,但对于goto语句和if语句构成的循环不能用break和continue进行控制。切记:
    do....while();这里while()括号后面的分号不能省略。
    break的作用只有两个:
    (1)跳出最近的那层循环。
    (2)跳出最近的整个switch语句。
15、提到字符串就必须说说字符串常量,比如:
   char *c = "asdf";这样用指针定义的字符串常量不能改变字符串的任何字符,因为字符串常量存储在静态内存区的只读区域,所以如果你试图用*c++ = 'm'等语句想改变字符串的内容,系统编译不会发现问题,但运行时则会报错,这个问题前期一般很难发现,所以必须谨慎,字符数组可以修改如:char a[]="sdf",(奇怪的是好多C程序书籍居然没有提到这一点,真不明白现在的作者都是以何目的而写作的)。还有一点就是字符串连接:"ma" "wentao"就等价于"mawentao"
16、关于数组要说的首先是数组名,数组名在作为&和sizeof的操作数时,不会当做指针用,此时就代表整个数组,即char a[] = "bao"; &a就是数组的起始地址,即&a[0].
  其次,函数不能返回数组,只能返回数组的首地址(指针),关于数组的初始化必须按顺序来。
  最后,数组中的元素长度都是相同的,即都是相同的类型,所以数组元素不可能是像函数等等这些没固定长度的元素,而且定义数组时下标必须是个常量即数组大小在编译时就要确定。
  (ANSI标准规定数组下标访问不能超过数组左边界,但VC++6.0没这限制,不论数组左边界还是右边界都可以随便超出访问,不过没实际意义,所以程序员自己要注意)
17、关于指针,好多作者都会给读者一个下马威,说是指针特别复杂,其实真没有什么,指针就是地址。一般指针变量自身都占4个字节,它所指向的类型除了基本类型外比较复杂的有结构体 、数组、函数。数组名作为参数传递时就是首地址的拷贝,而结构仍是结构本身的拷贝。
    指针复杂声明:
    int **p; 指针的指针。
    float(*p)[4];数组指针。
    int (*p)(int); 函数指针。
    array[5]等价于5[array],因为内部都是指针加下标偏移量实现的。
    (复杂声明的理解技巧其实很简单,就是每次都从变量名开始根据它前后的符号确定其根本)
18、extern声明外部变量,可以扩展外部变量的作用域。如:extern a,b;...int a=10,b=11;虽然a和b在extern语句之后定义但在extern后面且在a和b定义之前的语句都可以用a和b。 extern用于函数定义表示全局可见(不加也可以),用于变量说明它在其他地方定义。
19、在编译时,对类型是不分配空间的,只对变量分配空间。比如:建立结构体类型struct student{char name[],int age};此时不会分配内存,只有定义了变量在系统编译时才分配空间。比如:struct student student1;
20、sizeof操作符可以获得一个类型所占的字节数,sizeof不是个函数,如果后面的操作数不是个类型名就不用加括号。如:int i; sizeof i;当sizeof操作结构时,好多时候都大于结构中所有成员的长度和,这是由于字节对齐所造成的。操作数组时会返回整个数组的长度。

收藏收藏
热门技术、经典电源设计资源推荐

世纪电源网总部

地 址:天津市南开区黄河道大通大厦8层

电 话:400-022-5587

传 真:(022)27690960

邮 编:300110

E-mail:21dy#21dianyuan.com(#换成@)

世纪电源网分部

广 东:(0755)82437996 /(138 2356 2357)

北 京:(010)69525295 /(15901552591)

上 海:(021)24200688 /(13585599008)

香 港:HK(852)92121212

China(86)15220029145

网站简介 | 网站帮助 | 意见反馈 | 联系我们 | 广告服务 | 法律声明 | 友情链接 | 清除Cookie | 小黑屋 | 不良信息举报 | 网站举报

Copyright 2008-2024 21dianyuan.com All Rights Reserved    备案许可证号为:津ICP备10002348号-2   津公网安备 12010402000296号