第一章 初识C语言
#include<stdio.h>
一般而言,每个c\c++程序通常由头文件和定义文件组成。头文件作为一种包含功能函数,数据接口声明的载体文件,主要用于保存程序的声明,而定义文件用于保存程序的实现。.c就是你编写的程序文件。 编译时,编译器通过头文件找到对应的函数库,进而把已引用函数的实际内容导出来代替原有的函数 头文件以《.h》作为扩展名
main函数
一个c程序总是从main()函数开始执行的。int指明了main()函数的返回类型,传递给函数的信息一般被包含在函数名后面的括号内,void表示没有传递参数。
main函数的返回类型是整型,而程序最后的return 0;说明函数的返回值。那么这个0表示返回哪里呢?返回操作系统,表示程序正常退出,return语句的作用不只是返回一个值,还有结束函数。
定义常量
使用#define定义一个符号名PI,其值为3.14159626
声明函数原型
函数声明称为函数原型,它的主要作用是利用它在程序编译阶段对调用函数的合法性进行全面检查。 以上声明不包括参数类型和参数个数,系统不检查参数类型和参数个数
如果在函数调用前没有对函数做出声明,则编译系统会把第一次遇到的该函数的形式(函数定义或函数调用)作为函数的声明,并将函数类型默认为整型。可能编译时会报错。
程序语句
一般一条语句占一行,语句以分号“:”结束,在使用变量前进行定义,编译器遇到变量定义语句时,按变量类型为其分配内存空间。
函数定义
在更多情况下,用户需要编写自己的函数,以完成特定的功能。 函数定义包括两部分:函数头和函数体。函数头定义函数的名称、参数和返回值的类型;而函数体则定义函数具体完成的工作。
注释
第二章 数据是一切程序存在的基础
数据类型是按规定的形式表示数据的一种方式,不同的数据类型占用不同的数据空间
数据类型
数据类型
基本类型
构造类型
指针类型
空类型
整数类型
浮点数类型
字符类型
枚举类型
数组类型
结构类型
联合类型
基本类型
整型一般占用四个字节(32位),最高位代表符号位,整数用0来表示,负数用1来表示,取值范围-2147483648~2147483647 浮点型 单精度占用4字节(32位),双精度占用8字节(64位)
构造类型
构造类型是指使用基本类型或其他已定义的一个或多个数据类型来构造一个新的数据类型。
struct point { //包含四个变量成员
int x;
int y;
cahr z;
int A[10];
};
指针
内存
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。
所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地 址。
定义指针变量(指针变量是一种变量,这个变量使用来存放地址
int* pa 称 pa 指针或指针变量
说明pa是个指针
int 说明pa所指向的变量类型a是个整型
*pa 通过pa存放的地址找到他所指向的对象
*pa=20 //解引用操作符 等价于 a=20
变量都有地址,取出变量地址如下:
#include <stdio.h>
int main()
{
int
num = 10;
& num;//取出num的地址
//注:这里num的4个字节,每个字节都有地址,取出的是第一个字节的地址(较小的地址)
printf("%p\n",& num);
//打印地址,%p是以地址的形式打印
return 0;
}
那地址如何存储,需要定义指针变量。
int num = 10;
*int p;//p为一个整形指针变量
p = & num;
指针类型
指针的值表示某个内存地址,有了地址,便能很方便的访问内存。
空类型
空类型主要用来设置函数的返回值,函数在结束的时候一般都会要求调用者返回一个类型,如整型,指针类型。如果函数不返回值,就设置函数返回值为空。
void main() {
}
数据的存储原理
内存单元
在个人计算机中,一般由8个二进制“位”组成一个“字节”(byte)
在计算机中,每个内存单元都有一个地址,通过这个地址即可对内存中的数据进行保存和读取操作。
在C程序中,程序员一般不用关心具体的地址值,这些都有C编译器自动处理。
字符的存储
要将数据保存到计算机中,必须使用二进制形式表示数据。 对于字符,可使用ASCII(美国标准信息交换码)来表示。ASCII码将字母、数字和特殊符号进行编号,如在计算机中保存字母“a”时,实际上是保存数字编号97(97转换成8位二进制数为“0110001”)
数值的存储
一般整数用2字节来存放,在计算机中每个字节都是二进制位,那么计算机就通过数据类型来识别保存的是整数还是字符,如果设置保存字符,则将数据写入1字节中;如果设置保存整数,则将向内存中相邻的2字节中写入数据。在读出数据时,若指定读取的数据为一个字符,则只从内存中读取1个字节的数据;若指定读取一个整数值,则将读取内存中的相邻的2字节,并组合为一个整数值。
标识符和关键字
标识符
为了引用常量,数组,函数,宏名等,需要给这些元素设置一个名称,这个名称即标识符。(如起名字)
命名规则
标识符必须以字母az,AZ或下划线“_”开头,后面可以跟任意多个,其他字符不允许出现在标识符。(区分大小写)
C语言中的关键字(或称保留字)具有特殊意义,不能作为用户自定义的标识符。
关键字
关键字
1 关键字不能字节创建
2 变量名不能是关键字
ANSI C 标准C语言共有32个关键字,9种控制语句。
auto break case char const continue default do else enum extern float double for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
extern 声明外部变量
sizeof
typedf 类型重命名
unsigned 无符号整型
do
while
auto
break
default
enum
程序中只能使用关键字的规定作用,而不能给它们赋与新的含义。
常量
程序执行时其值不发生改变的的量,可改变的量称为变量
常量
直接常量
符号常量
#define宏定义
const语句定义
直接常量
又称字面常量,通过数据直接表现的形式来确定其数据类型,例如 s=3.14rr
符号常量
习惯上符号常量的标识符用大写字母,变量的标识符用小写字母。
使用符号常量的优点如下: 1使程序中的常量含义清楚 2若需修改常量,则只需修改定义符号的常量的语句即可
可用两种方法定义符号常量
1.#define宏定义
#define 符号常量名 宏表达式
注意:使用#define进行宏定义时,最后不能添加分号,若有分号,则在进行宏替换时将连分号一起替换,将得到错误。
#include <stdio.h> #define PI 3.14 //宏定义一个常量,PI的值为3.14
int main() {
float r; //定义一个浮点型变量r
·······
}
//define定义标识符常量
#define MAX 1000
//define定义宏
#define ADD(x, y) ((x)+(y)) //定义宏
#include <stdio.h>
int main()
{
int sum = ADD(2, 3);
printf(“sum = %d\n”, sum);
sum = 10*ADD(2, 3);
//预编译的时候代码被替换成
// int sum=10*((2)+(3))
代码足够简单的时候使用宏
printf(“sum = %d\n”, sum);
return 0;
}
const语句定义的常量
const 类型 符号常量=表达式;
注意:const是一条语句,需要在语句末尾添加分号作为结束。
const语句支持为常量指定类型,编译器在编译代码时将对其类型进行安全检查。使用const定义的符号常量有自己的内存地址,编译器为其分配了存储空间。
变量
变量需要先定义再使用,否则编译器会报错。
类型说明符 变量名表;
在一个类型说明符后面可以声明多个变量,各个分量之间用逗号分隔
int num,count; 提示:在编译程序时,编译器将在内存中按声明的数据类型为变量分配存储空间
应在使用前对变量赋初值3,使其具有确定的值,这种方法称为初始化。
在声明变量时不允许连续赋值
字符常量
与整形不同,字符常量必须使用指定的定界符来进行限制,字符常量使用单引号括起来的一个字符(不能是多个字符)
w a f # 0 e g都是合法的字符常量
注意
1,字符常量的定界符为单引号,即只能用单引号括起来,不能用双引号或其他符号
2,一对单引号中只能包括一个字符,不能是多个字符。 3,字符可以是ASCII码中的任意字符 4,数字被定义为字符型之后就不能代表数字字面的量,若参与数值运算,其值是对应的ASCII码。如字符常量8和8是不同的。8是字符常量(其ASCII值为56),这时能参与运算,如加上10,将得到数值66.
字符变量及其初始化
使用char关键字声明 char a
字符变量赋初值 c1=w
C编译器将双引号括起来部分作为字符串
字符变量是作为一个整数保存的,c1=119,使用整数值给字符变量赋值时,如果整数值超过取值范围会报错(取值范围-128~127)
转义字符
除英文字母,数字一些特殊符号能在屏幕上显示之外,还有许多不能显示的字符,如让计算机峰鸣的ASCII值为7,怎样将这个字符赋值给一个变量?可使用两种方法来表示。
第一种方法:
将ASCII值直接赋给char变量
char beep=7;
第二种方法
使用转义字符,转义字符是一个特殊的字符常量,以反下划线“\”开头,后跟一个或几个字符,反斜线后面的字符不再有原来的意义,所以称为转义字符。
C语言字符集中的任何一个字符都可用转义字符来表示,表2-2中的\ddd和\xhh正式为此而提出的,ddd和xhh分别为八进制和十六进制的ASCII码值。如\111表示字母“I”,\112表示字母“J”,\x2a表示字符“*”等。
逻辑性(_Bool)
_Bool 类型 可用来存储数据值0和1(false和true),_BOOL类型是一个整数类型
static关键字 静态关键字
static是用来修饰变量和函数的
1.修饰局部变量-静态局部变量
使得局部变量出了自己的范围也不销毁,其实是改变了局部变量的生命周期,但是作用域还是局部的
2.修饰全局变量-静态全局变量
全局变量本身是具有外部连接属性,但是static修饰全局变量会失去外部链接属性,变成内部链接属性
所以static修饰的全局变量,只能在自己所在的.c文件中使用
3.修饰函数-静态函数
函数默认是具有外部链接属性 但是被static修饰之后,会使得函数失去外部链接属性 变成了内部链接属性 所以static修饰的函数只能在自己所在的.c文件使用,不能在其他源文件使用
关键字typedef
typedf顾名思义就是类型定义,这里应该理解为类型重命名
//将unsigned int 重命名为uint_32,
所以uint_32也是一个类型名
typedef unsigned int uint_32;//类型重命名
int main()
{
//观察num1和num2,这两个变量的类型是一样的
unsigned int num1 = 0;
uint_32 num2 = 0;
return 0;
}
结构体 struct
复杂对象,不能用简单的类型直接描述
struct Stu
{ char name[20];//名字
int age; //年龄
char sex[5]; //性别
char id[15]; //学号
};
结构体的初始化:
//打印结构体信息
struct Stu s = {“张三”, 20, “男”, “20180101”};
//.为结构成员访问操作符
printf(“name = %s age = %d sex = %s id = %s\n”, s.name, s.age, s.sex, s.id);
//->操作符
struct Stu *ps = &s;
printf(“name = %s age = %d sex = %s id = %s\n”, ps->name, ps->age, ps->sex, ps- >id);
struct Book
{ char name[30]; //书名
float price; //定价
cha id[20]; //书号
}
int main()
{ //结构体变量的定义和初始化
struct BOOK b1={“数据结构”,60.0f,“D5544654”};
struct Book b2={“操作系统”,55,“S456546”};
printf(“书名:%s\n”,b1.name);
printf(“价格%f\n”,b1.price);
printf(“书号%s\n”,b1.id);
}
struct Book*pb