常量
整型常量(Integer)
整形常量的表示形式
整型常量的表示形式 | 特点 | 举例 |
---|---|---|
十进制 | 0-9 的数字序列组成,数字前可带正负号 |
256,-128,0,+7 |
八进制 | 以0 开头,后跟0-7 的数字序列组成,0 前可带正负号 |
021,-017 |
十六进制 | 以0x 开头,后跟0-9 ,a-f 的数字序列组成 |
0x12,-0x1F |
整型常量的类型
指数形式
0.345e-5
=0.00000345
实型常量的类型
- 实型常量隐含按双精度型(double)
- 单精度:
f
- 长双精度(long double):
l
字符常量
转义字符
字符 | 含义 |
---|---|
\n |
换行(new line) |
\r |
回车(不换行)(carriage return) |
\0 |
空字符,代表ASCII码值为0的字符 |
\t |
水平制表(horizontal tabulation) |
\b |
退格(backspace) |
\" |
双引号(double quotation mark) |
\' |
单引号(single quotation mark) |
\\ |
反斜线(backslash) |
\? |
问号 |
变量
局部变量
- 局部变量定义时不会自动初始化,若未赋初值,则取随机值
全局变量
*全局变量定义时未赋初值则初始化为0
静态变量
- 静态变量会保持上一次的值
- 若未赋初值,则初始化为0
const类型修饰符
- const常量只能在定义时赋初值,不能再程序中改变其值。
char
类型与int
类型的关系
char
型可看作一种特殊的int
型。- 在C语言中,只要在ASCII码取值范围内,
char
型数据和int
型数据可以相互转换,即char型数据可以参与任何int型数据的运算
例:
一个char
型变量既可以以字符格式输出,也可以以整形格式输出,以整形格式输出即输出其ASCII码的十进制值。
char ch='a'; |
变量Tips
char
型数据在内存中只占1个字节int
型与程序执行环境的字长有关。16位下占16位,即2个字节;32位下占32位,即4个字节。
可以使用sizeof
计算类型的字节数对于实数,无论是小数表示形式还是指数表示形式,在计算机内部都是采用浮点数方式来存储。
*
运算符
算术运算符
- 两个整数相除的结果仍为整数,舍去小数部分的值。
- 整数与实数原酸的结果为
double
型 - 求余运算限定参与运算的两个操作数为整数。余数的符号与被除数的符号相同。
常用的标准数学函数
函数名 | 功能 |
---|---|
sqrt(x) | 计算平方根 |
fabs(x) | 计算绝对值 |
log(x) | 计算lnX的值 |
log10(x) | 计算lgX的值 |
exp(x) | 计算e^x的值 |
pow(x,y) | 计算x^y的值 |
赋值运算符
=
左侧只能是变量名
位运算符
- 位运算符的操作对象只能是
char
和int
类型 &
:按位与,一种对某位清零的手段,即两个操作数中任意一位为0,则结果置0|
:按位或,一种对某位置1的手段,即两个操作数中任意一位为1,则置1^
:按位异或,两个操作数位不同,则置1<<
:左移位,每左移一位相当于乘2>>
:右移位,每右移一位相当于除2
类型转换
赋值中的类型转换
- C语言支持类型自动转换机制
表达式中的类型转换
- 表达式中若混有不同类型的常量及变量,则先要全部转换为同一类型,再进行运算。
- 类型提升(Type Promotion):把所有操作数都转换成占内存字节数最大的操作数类型。
输入/输出
printf()
- 格式转换符
格式转换符 | 用法 |
---|---|
%d | 带符号的十进制整数 |
%u | 无符号的十进制整数 |
%o | 无符号的八进制整数,不输出前导符0 |
%x | 无符号的十六进制整数(小写),不输出前导符0x |
%c | 输出一个字符 |
%s | 输出字符串 |
%% | 百分号% |
* 格式修饰符
格式修饰符 | 用法 |
---|---|
英文字母l |
输出long型数据 |
最小域宽m |
指定输出项输出时所占的列数。若m为正整数,向右靠齐。若m为负整数,向左靠齐。 |
显示精度.n | 对于浮点数,指定输出的浮点数的小数位数。对于字符串,指定输出截取的子串字符个数 |
scanf()
- 格式转换符
格式转换符 | 用法 |
---|---|
%d | 十进制整数 |
%o | 八进制整数 |
%x | 十六进制整数 |
%c | 字符,空白字符(空格、回车、制表符)也作为有效输入 |
%s | 字符串,遇到第一个空白字符输入结束 |
%f | 实数 |
%% | 百分号 |
* 格式修饰符
格式修饰符 | 用法 |
---|---|
忽略输入修饰符* |
表示对应的输入项在读入后不赋给相应的变量 |
域宽m |
指定输入的数据的宽度,按此宽度截取所需数据 |
函数
- 宏是预处理阶段替换,函数是运行时调用。
数组
- 定义数组的大小必须使用整型常量或整型常量表达式。
如int score[100]
合法,而int score[n]
非法 - C语言的数组在内存中是按行存放的。
- 数组名代表数组的首地址
- 数组不能整体引用,每次只能引用数组的一个元素
- 不能用赋值表达式对数组元素进行整体赋值。如
score={1,2,3,4,5};
非法
数组的初始化
- 引用数组前,必须保证数组的元素被赋以确定的
- 二维数组,既可以按元素初始化,也可以按行初始化
如:int matrix[3][2]={(1,2,3,4),{5,6,7,8}};//按行初始化
int matrix[3][2]={1,2,3,4,5,6,7,8};//按元素初始化
- 当初始化列表中提供的初值个数少于数组元素个数时,自动给后面的元素赋值为0
如
int matrix[1][2]={0}; |
- 当数组被声明为static(静态)类型或外部存储类型(即在所有函数外部定义时),则在不显式给出初值的情况下,数组元素将在程序编译阶段自动初始化为0。
向函数传递一维数组
- 可以用数组名作为函数参数
- 在接收一维数组的函数中,在声明一维数组的形参时,可以省略数组的长度
如:
void sort(int arr[10]); |
向函数传递二维数组
- 在接收二维数组的函数中,在声明二维数组形参时,不能省略数组第二维的长度。
如:
void func(int arr[4][3]); |
字符数组
字符数组与字符串关系
- 字符串由若干有效字符及字符
'\0'
作为结束标志的一个字符序列。 - 字符串借助字符型一维数组存储。
- 最后一个
'\0'
占用一字节的存储单元,但是不计入字符串的实际长度。 - 每个字符串在内存中占用一串连续的存储空间,而且这段连续的存储空间有唯一的首地址。
- 如果一个字符串只是字符串常量,则这个字符串常量本身代表的是该字符串在内存中所占连续存储空间的首地址,是一个地址常量。
- 一维字符数组可存放一个字符串,二维字符数组可存放多个字符串。
字符串赋值给字符数组
1.用char
数据对数组初始化
char str[6]={'C','h','i','n','a','\0'};
此种方式赋初值,必须人为的加入'\0'
2.用字符串常量对数组初始化
char str[]="China";
* 对于二维字符数组存放多个字符串,第二维的长度不能省略,应该按最长的字符串长度设定。char weekday[][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
字符数组的输入/输出
1.以c
格式字符一个个单独输入/输出
for(i=0;i<10;i++){ |
2.以s
格式作为字符串整体输入/输出
scanf("%s",str); |
【注】space
、enter
、tab
作为以%s
格式输入字符串的分隔符,因而不能被读入,遇到这些字符即结束输入。
3.用gets()或puts()输出/输出
- gets()从键盘读入一个字符串(包括空格符)
- puts()输出一个字符串,当遇见第一个
'\0'
时输出结果,并自动输出一个换行符
字符串处理函数
- 需要#include
指针
- 指针:是一种特殊的数据类型,只存放地址型数据
- 直接寻址:按变量名来存取变量内容的访问方式
- 间接寻址:通过指针变量间接存取指向的变量的访问方式
指针Tips
a=*p++;
,其中++
与*
优先级相同,且是右结合的。
相当于a=*(p++);
,而++
又位于变量p
之后,即相当于
a=*p; |
a=(*p)++
相当于
a=*p; |
字符指针
字符指针与字符数组的区别
1. 初始化含义不同
char str[10]="China";
表示定义一个字符数组str
,数组名str
代表字符串"China"
在内存中存放的首地址。char *ptr="China";
表示定义一个字符指针ptr
,并在定义时用字符串"China"
在内存中的首地址为指针变量ptr
赋初值。
2. 赋值方法和含义不同。
- 指针赋值
char *ptr; |
字符串中的一个字符的地址赋给ptr
,相当于用地址值对ptr
赋初值。
* 字符数组赋值
char str[10]; |
以上方法是错误的,数组名是数组元素的首地址,是一个常量值,无法被改变。
将一个字符串赋值给字符数组必须使用strcpy
strcpy(str,"China");
3. 输入方式不同
- 字符数组输入
char str[10]; |
- 字符指针
必须保证字符指针事先已经指向一个数组的首地址
char *ptr,str[10]; |
4.类型不同
* 字符数组的数组名是一个地址常量,值不能改变
* 字符指针是一个变量,值可以被改变
【注】
由于数组名作函数形参与指针变量作函数形参的等价性。因此,在用数组名作函数形参的函数体内部可以对该声明为形参的数组名进行和指针一样的自增、自减运算。除此之外的数组名都是一个指针常量,不能进行自增、自减的运算。