C语言基础知识备忘

C语言基础知识备忘

常量

整型常量(Integer)

整形常量的表示形式

整型常量的表示形式 特点 举例
十进制 0-9的数字序列组成,数字前可带正负号 256,-128,0,+7
八进制 0开头,后跟0-7的数字序列组成,0前可带正负号 021,-017
十六进制 0x开头,后跟0-9,a-f的数字序列组成 0x12,-0x1F

整型常量的类型

  • 长整形:l,如:-256L,1024l
  • 无符号整形:u,如:30u,256U,
    不能表示成小于0的数,如-30u非法
  • 无符号长整形:lu,30lu

实型常量(Float)

指数形式

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';
printf("%c,%d\n",ch,ch);

-->a,97

变量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的值

赋值运算符

  • =左侧只能是变量名

位运算符

  • 位运算符的操作对象只能是charint类型
  • &:按位与,一种对某位清零的手段,即两个操作数中任意一位为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};
等价于
int matrix[1][2]={0,0};
  • 当数组被声明为static(静态)类型或外部存储类型(即在所有函数外部定义时),则在不显式给出初值的情况下,数组元素将在程序编译阶段自动初始化为0。

向函数传递一维数组

  • 可以用数组名作为函数参数
  • 在接收一维数组的函数中,在声明一维数组的形参时,可以省略数组的长度
    如:
void sort(int arr[10]);
等价于
void sort(int arr[]);

向函数传递二维数组

  • 在接收二维数组的函数中,在声明二维数组形参时,不能省略数组第二维的长度。
    如:
void func(int arr[4][3]);
void func(int arr[][3]);
都合法,但
void func(int arr[][]);
非法

字符数组

字符数组与字符串关系

  • 字符串由若干有效字符及字符'\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++){
    scanf("%c",&str[i]);
}
for(i=0;str[i]!='\0';i++){
    printf("%c",str[i]);
}
2.以s格式作为字符串整体输入/输出
scanf("%s",str);
printf("%s",str);

【注】
spaceentertab作为以%s格式输入字符串的分隔符,因而不能被读入,遇到这些字符即结束输入。

3.用gets()或puts()输出/输出
  • gets()从键盘读入一个字符串(包括空格符)
  • puts()输出一个字符串,当遇见第一个'\0'时输出结果,并自动输出一个换行符

字符串处理函数

  • 需要#include

指针

  • 指针:是一种特殊的数据类型,只存放地址型数据
  • 直接寻址:按变量名来存取变量内容的访问方式
  • 间接寻址:通过指针变量间接存取指向的变量的访问方式

指针Tips

  • a=*p++;,其中++*优先级相同,且是右结合的。
    相当于a=*(p++);,而++又位于变量p之后,即相当于
a=*p;
p=p+1;
  • a=(*p)++相当于
a=*p;
*p=*p+1;

字符指针

字符指针与字符数组的区别

1. 初始化含义不同
  • char str[10]="China";
    表示定义一个字符数组str,数组名str代表字符串"China"在内存中存放的首地址。
  • char *ptr="China";
    表示定义一个字符指针ptr,并在定义时用字符串"China"在内存中的首地址为指针变量ptr赋初值。
2. 赋值方法和含义不同。
  • 指针赋值
char *ptr;
ptr="China";        //正确

字符串中的一个字符的地址赋给ptr,相当于用地址值对ptr赋初值。
* 字符数组赋值

char str[10];
str="China";//错误

以上方法是错误的,数组名是数组元素的首地址,是一个常量值,无法被改变。
将一个字符串赋值给字符数组必须使用strcpy
strcpy(str,"China");

3. 输入方式不同
  • 字符数组输入
char str[10];
scanf("%s",str);
  • 字符指针
    必须保证字符指针事先已经指向一个数组的首地址
char *ptr,str[10];
ptr=str;
scanf("%s",ptr);

4.类型不同
* 字符数组的数组名是一个地址常量,值不能改变
* 字符指针是一个变量,值可以被改变

【注】
由于数组名作函数形参与指针变量作函数形参的等价性。因此,在用数组名作函数形参的函数体内部可以对该声明为形参的数组名进行和指针一样的自增、自减运算。除此之外的数组名都是一个指针常量,不能进行自增、自减的运算。

你可能感兴趣的:(C语言基础)