1.数据类型
yum -y install gcc,yum install gcc-c++,一个程序只有一个main函数
#include
:包含其他文件预处理指令
main(){}
:这个是最简单的C程序
()
:函数的参数放在括号中
;
:程序只认半角分号
/*...*/
:多行注释
1.基本类型
字符型(char)
:描述单个字符,用单引号包含起来,如’a’,‘A’,‘1’,’$'等,键盘能输入的英文和半角的符号都是字符。关键字char是单词character(字符)的简写。中文里的汉字和标点符号是两个字节,不能算一个字符,以下都是非法的
整型(int)
:描述整数,整数在计算机上是准确表示的,如123,500,0,-10等。关键字int是integer(整数)的简写
浮点型(double)
:描述实数,有小数位,如10.0,123.55,3459.98,-50.3,实数在计算机上一般是近似表示的,关键字double(双倍的)
2.字符串
描述多个字符,用双引号包含起来,可以是英文,数字,中文,标点符号,半角全角都可以
3.构造类型
:由已知的基本类型通过一定的构造方法构造出来的类型,包括数组和结构体
4.指针类型
:指针可以指向内存地址,主要用于函数的参数传递
C语言还有其他数据类型像单精度浮点型(float)等等,暂不介绍
2.常量和变量
对计算机来说,图片,文字,音乐,视频等都是数据,在计算机以二进制的0和1存储,数据量越大,0和1就越多。数据分为静态数据和动态数据。我们写程序目的就是告诉计算机如何输入,处理,传输,存储和展示数据
1.静态数据:
永久性数据,一般存储在硬盘中,只要硬盘没坏数据都是存在的,电脑关机重启后依然存在
2.动态数据(临时数据):
程序运行过程中,动态产生的临时数据,一般存储在内存中,软件或者电脑关闭则这些临时数据会被清楚
为什么不把动态数据存放到硬盘呢?因为访问内存的速度比访问硬盘快很多倍。但是与硬盘相比,内存的存储空间比较小
3.数据大小
:(1)数据都是由二进制的0和1组成。
(2)数据都会占用空间,静态数据占硬盘空间,动态数据占内存空间。
(3)数据占用空间的最小单位是比特(bit)。一个1或者0就是一个比特,即1bit。
(4)计算机中,以字节为单位存储数据。1字节=8比特(1Byte=8bit)
(5)1B=8bit,1KB=1024B,1MB=1024KB,1GB=1024MB…
常量:
即常数,表示固定的数据
(1)字符常量 如’6’,‘a’,‘F’(不能是中文,例如:‘男’)
(2)整数常量 如6,27,-299
(3)浮点数常量 如5.43,-2.3,5.67,6.0
(4)字符串常量 如’‘625’’,’‘女’’,’‘nanbc’’,’‘西施’’
变量:
如果数据的值不确定的,或者经常需要改变,或者临时取值的,则用变量取值。常量指具体数据,变量指存数据的容器,水与水桶一样。变量使用前必须先进行声明(或定义)。在内存中分配一块存储空间给变量,用于存放数据。如果要定义多个变量就要为多个变量分配不同的内存空间
1.整数型,字符型,浮点型变量的定义
变量的定义,也称之为变量的声明,或定义变量,或声明变量,实际同一个意思
int ii;
//定义整数型变量,用于存放整数,关键字int,是单词integer(整数)的缩写
char cc;
//定义字符串变量用关键字char,是单词charcter(字符)的缩写,存放字符
double money;
//定义浮点型变量,用于存放浮点数,关键字double
2.字符串变量的定义
C语言中没有字符串这个数据类型,而是用字符数组来表达字符串
3.变量的命名
变量名属于标识符,需要符合标识符的命名规范,如下:
1)变量名的第一个字符必须是字母或下划线,不能是数字和其它字符。
2)变量名中的字母是区分大小写的。比如 a 和 A 是不同的变量名,num 和 Num 也是不同的变量名。
3)变量名绝对不可以是C语言关键字。
关键字
也成为保留字,共32个
关键字也称为保留字,共32个,也就是说这些单词在C语言中有特别的含义,程序员不能把它用于变量或函数的命名。
auto :声明自动变量
break:跳出当前循环
case:开关语句分支
char :声明字符型变量或函数返回值类型
const :声明只读变量
continue:结束当前循环,开始下一轮循环
default:开关语句中的“默认”分支
do :循环语句的循环体
double :声明双精度浮点型变量或函数返回值类型
else :条件语句否定分支(与 if 连用)
enum :声明枚举类型
extern:声明变量或函数是在其它文件或本文件的其他位置定义
float:声明浮点型变量或函数返回值类型
for:一种循环语句
goto:无条件跳转语句
if:条件语句
int: 声明整型变量或函数
long :声明长整型变量或函数返回值类型
register:声明寄存器变量
return :子程序返回语句(可以带参数,也可不带参数)
short :声明短整型变量或函数
signed:声明有符号类型变量或函数
sizeof:计算数据类型或变量长度(即所占字节数)
static :声明静态变量
struct:声明结构体类型
switch :用于开关语句
typedef:用以给数据类型取别名
unsigned:声明无符号类型变量或函数
union:声明共用体类型
void :声明函数无返回值或无参数,声明无类型指针
volatile:说明变量在程序执行中可被隐含地改变
while :循环语句的循环条件
变量的初始化:
在main函数内部定义的变量称为局部变量,局部变量被定义后,系统不会对其初始化,必须自己写程序初始化
1.整数型,字符型,浮点型变量初始化:
就是赋0值,也可在定义时初始化
int ii=0; // 定义整数型变量并初始化
char cc=0; // 定义字符型变量并初始化
double money=0; // 定义浮点型变量并初始化
也可以先定义,然后再初始化
int ii; // 定义整数型变量
char cc; // 定义字符型变量
double money; // 定义浮点型变量
ii=0; // 初始化ii为0
cc=0; // 初始化cc为0
money=0; // 初始化money为0
2.字符串变量的初始化
对字符串变量来说,初始化就是把内容清空。
char name[21]; // 定义一个可以存放20字符的字符串
memset(name,0,sizeof(name)); // 清空字符串name中的内容
3.未初始化的变量示例
未初始化的变量会导致在内存中可能有垃圾值。
多变量定义:int ii,jj;,const 是 constant 的缩写,意思是“恒定不变的”!它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。用 const 定义常变量
方法很简单,就在通常定义变量时前面加 const 即可,如:const double pi = 3.1415926;
用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值,如果程序中试图改变它的值,编译的时候就会报错。
3.输入和输出
数据输入:
编写程序的主要目的是为了处理数据,但是,数据从哪里来?数据的来源有很多种方式,如从磁盘文件中读取数据、从数据库中读取数据、从网页中抓取数据等,还有一种重要的方式就是从键盘输入数据。在C语言中,有三个函数可以从键盘获得用户输入。
getchar 用于输入单个字符。
gets 获取一行数据,并作为字符串处理。
scanf 最灵活、最复杂、最常用的数据输入函数。
数据输出:
在C语言中,有三个函数可以把数据输出到屏幕。
putchar 用于输出单个字符。
puts 输出字符串。
printf函数是格式化输出函数, 用于向屏幕输出数据。
printf函数的调用方法是: printf(格式化字符串,参数列表);
1.输出描述性的文字
输出的文字用双引号包含起来,在文字最后加上\n表示换一行,多个\n可以换多行。
printf(“我心非席,不可卷也,我心非石,不可转也。\n”);
以上代码将在屏幕上输出文字:我心非席,不可卷也,我心非石,不可转也。
输出文字之后,再输出一个换行。
2.输出整数
输出的整数常量或整数变量用%d表示,在参数中列出待输出的整数常量或整数变量。
printf(“我年龄是%d岁。\n”,18);
int age=18;
printf(“我年龄是%d岁。\n”,age);
3.输出字符
输出的字符常量或字符变量用%c表示,在参数中列出待输出的字符常量或字符变量。
printf(“我姓别是:%c。\n”,‘x’); // 姓别:x-男;y-女
char xb=‘x’;
printf(“我姓别是:%c。\n”,xb);
4.输出浮点数
输出的浮点型常量或浮点型变量用%lf表示,在参数中列出待输出的浮点型常量或浮点型变量。
printf(“我体重是%lf公斤。\n”,62.5);
double weight=62.5;
printf(“我体重是%lf公斤。\n”, weight);
5.输出字符串
输出的字符串常量或字符串型变量用%s表示,在参数中列出待输出的字符串常量或字符串变量。
printf(“我的姓名是%s。\n”,“豫让”);
char name[21];
memset(name,0,sizeof(name));
strcpy(name, “豫让”);
printf(“我的姓名是%s。\n”,name);
6.输出多个内容
scanf输入
:
scanf函数是格式化输入函数, 用于向接受键盘输入的数据,用户输入数据完成后,需按回车键(Enter)结束输入。
scanf函数的调用方法是: scanf(格式化字符串,参数列表);
注意,不要在scanf的格式化字符串的最后加\n。
1.输入整数
输入整数的格式用%d表示,在参数中列出整数型变量名,用于保存输入的数据。
在输入数据之前,一般要先输出一句话提示用户。下同。
int age=0;
printf(“请输入你的年龄:”); // 提示文字不要换行,让用户在后面输入,下同。
scanf("%d",&age); // 在变量名前要加符号&,键盘输入值放入age变量中去。
2.输入字符
输入字符的格式用%c表示,在参数中列出字符型变量名,用于保存输入的数据。
char xb=0;
printf(“请输入你姓别:”);
scanf("%c",&xb); // 在变量名前要加符号&
3.输入浮点数
输入浮点数的格式用%lf表示,在参数中列出浮点型变量名,用于保存输入的数据。
double weight=62.5;
printf(“请输入你体重:”);
scanf("%lf",&weight); // 在变量名前要加符号&。
4.输入字符串
输入字符串的格式用%s表示,在参数中列出字符串变量名,用于保存输入的数据。
char name[21];
memset(name,0,sizeof(name));
printf(“请输入你姓名:”);
scanf("%s",name); // 注意了,变量名前不加符号&,也不要问原因,以后再介绍。
5.输入多个内容
调用一次scanf函数可以输入多个数据,注意了,与单个数据的输入不同,多个数据的输入要等全部的数据输入完成后才按回车键。
int age=0;
char xb=0;
double weight=0;
char name[21];
memset(name,0,sizeof(name));
printf("请输入你的姓名、姓别(x-男;y-女),年龄和体重,中间用空格分隔:");
scanf("%s %c %d %lf",name,&xb,&age,&weight);
// 只有name变量前没加&,其它的都加了。
scanf函数第一个参数(格式化字符串)的格式与后面的参数列表(变量的列表)要一一对应,不能多,不能少,顺序也不能错,否则会产生意外的结果。查找头文件:man memset显示如下
下图1,2,3去试
4.运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C 语言内置了丰富的运算符,并提供了以下类型的运算符:
1)算术运算符
2)赋值运算符
3)关系运算符
4)逻辑运算符
5)位运算符
如下浮点数没有取余数的说法
ii++,就是ii=ii+1
如上赋值运算符支持的是C语言的基本数据类型,包括char int double,字符串(字符数组)不能这么赋值。
‘=‘是赋值,’==‘才是判断两个数是否相等,C语言没有’‘之间’’,’‘中间’’,’‘之内’‘或’‘在某范围内’'的关系运算符,例如年龄在25-30岁之间,只能表达为:年龄大于等于25岁并且年龄小于等于30岁。括号中表达式会优先执行
,sizeof(指针)大小永远是8字节,如下是sizeof运算符,sizeof是C语言的关键字,发挥着运算符的作用。
它主要用来计算某一个变量在当前系统的内存中所需占用的字节数。变量的类型包括char、int、double、数组、结构体和其它自定义的数据类型。sizeof不是函数。
产生这样的疑问主要是因为sizeof的书写确实有点像函数,比如:i = sizeof(int);这样的写法,就很容易让人误以为sizeof是一个函数。sizeof有两种写法:
1.用于数据类型
sizeof使用形式:sizeof(type)
数据类型必须用括号括住。如sizeof(int)。
printf(“sizeof(int)=%d\n”,sizeof(int)); // 输出结果:sizeof(int)=4
2.用于变量
sizeof使用形式:sizeof(var_name)或sizeof var_name
变量名可以不用括号括住。如sizeof(var_name),sizeof var_name等都是正确形式。
printf(“sizeof dd =%d\n”,sizeof dd); // 输出结果:sizeof dd =8
printf(“sizeof(dd)=%d\n”,sizeof(dd)); // 输出结果:sizeof(dd)=8
5.if分支
不要在if(判断条件)后面加分号。有;号就为空语句,下面都执行
上面等同于下面两行
if(a>b) c=a;
else c=b;
6.switch分支
case后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量
default不是必须的,当没有default时,如果所有case都匹配失败,那么就什么都不执行
7.循环
在C语言程序中,一共有三种程序结构:顺序结构、选择结构(if和switch分支结构)、循环结构。
顺序结构:
从头到尾一句接着一句的执行下去,直到执行完最后一句;
选择结构:
到某个节点后,会根据一次判断的结果来决定之后向哪一个分支方向执行,由if、switch实现,前面的章节我们已经学习过。
循环结构:
循环结构有一个循环体,循环体里是一段代码。对于循环结构来说,关键在于根据判断的结果,来决定循环体执行多少次,由while、for和do while来实现。
如下为死循环的两种写法,循环条件永远为真,循环体中也没有满足跳出的条件
竖着循环9次,横着循环第几行循环几次
采用一个循环,输出0到100间的能整除5的数字
8.数组
定义数组时,数组的长度必须是整数(可以是常量,也可以是变量),数据额下标也必须是整数(可以是常量,也可以是变量)
下标越界导致程序异常中断(core dump),出现段错误
二维数组
二维数组的初始化也用memset
字符串是一个特别的字符数组,如果字符数组包含了空字符’\0’,则该数组中的内容就构成了一个字符串。’\0’可直接写成0
因为字符串需要用\0结尾,所以在定义字符串时,字符数组的长度要留多一个字节
char strname[21]; //定义一个最多存放20个字符或10个汉字的字符串
字符串数组:以0结尾的一维字符数组是一个字符串,给一维字符数组加上一维,就是字符串数组了
1.编写程序,从界面上输入一个字符串,计算字符串长度
如输入是"abcdaaf",显示的结果是:7 (最后是0)
2.编写程序,从界面上输入一个字符串,把字符串的每个字符从左到右一个一个显示出来
9.函数
连着_public.c一起编译,下面.c文件中都包含
_public.h
调用就是复制过程,一旦完成数据的复制,调用者程序的变量和函数的参数就再无关
10.变量的作用域
11.指针
变量的地址
对指针赋值
如下cc是容器,'A’是放在容器里的东西。pcc=&cc
不能直接对指针赋十进制或十六进制的值,通过指针操作内存变量
数组的地址:C语言中数组名是数组元素的首地址
,也是数组的地址,如下因为一个int占4字节
字符串的名字本身就是一个地址