基本语句:
表达式语句:其表现形式一般为:表达式;
执行表达式语句就是计算表达式的值。
空语句:一般由{ }来表示空语句,更简单明了,什么也不执行的语句;
复合语句:把多个语句看成一条语句去,复合语句中的各条语句以 ;结尾,同时在{ }外不可以加“ ;”
输入输出函数:
printf(" " );输出一个字符串;
打印格式 | 对应数据类型 | 含义 |
%d | int | 接受整数值并将它表示为有符号的十进制整数 |
%hd | short int | 短整数 |
%hu | unsigned short | 无符号短整数 |
%o | unsigned int | 无符号8进制整数 |
%u | unsigned int | 无符号10进制整数 |
%x,%X | unsigned int | 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF |
%f | float | 单精度浮点数 |
%lf | double | 双精度浮点数 |
%e,%E | double | 科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写 |
%c | char | 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 |
%s | char * | 字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0‘结尾,这个'\0'即空字符) |
%p | void * | 以16进制形式输出指针 |
%% | % | 输出一个百分号 |
scanf(“ %d ”,&a)输入一个整型的值赋给a,scanf通过%转义的方式可以得到用户通过标准输入设备输入的数据。
三大语句结构:
顺序语句:顺序结构没有任何关键字对代码进行流程控制,个语句依照顺序执行,例如:
int a =1;
int b =3;
int c =5;
int x;
a = c + b;
c = a + b;
x = a + c;
选择语句:
if语句:
if (a > b)
{
printf("%d\n", a);
}
if-else语句:
if (a > b)
{
printf("%d\n", a);
}
else
{
printf("%d\n", b);
}
if-else if-else语句:
if (a < 10)
{
printf("个位\n");
}
else if (a < 100)
{
printf("十位\n");
}
else if (a < 1000)
{
printf("百位\n");
}
else
{
printf("很大\n");
}
switch( 表达式){
case(常量表达式):
复合语句;
break;
case2(常量表达式2):
复合语句2;
break;
............
default:
复合语句....
break;
处理流程:首先计算表达式中的值,而后与其下case语句中的常量表达式相比较若其值相等则执行其下的复合语句,要不然执行default条件下的语句;
三目运算符:表达式1?表达式2: 表达式3例如 (a >= b) ? a : b;美观且直接,执行效率比较快;
循环语句:
for语句: for(条件表达式1;条件表达式2;条件表达式3)
int i;
for(i = 0; i <= 100;i ++)
{
中间循环体
}
while语句: while(条件表达式)如果为真,则执行while中的循环体,为假则跳出循环;
while(a >20)
{
scanf("%d\n",&a);
printf("%d\n",a);
}
do-while语句:do{循环体}while(条件表达式)当条件满足的时候会执行循环体的内容;
do{
a++;
printf(" %d\n",a);
}while(a < 10)
break和continue语句:
break语句:
- 当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构。
2.当它出现在循环语句中,作用是跳出当前内循环语句,执行后面的代码 。
3.当它出现在嵌套循环语句中,跳出最近的内循环语句,执行后面的代码。
while(1)
{
int i = 0;
i++;
printf(" %d\n ",i);
if(i == 10)
{
break;
}
}
continue语句:终止本次循环,并执行下一次循环;
for (int i = 1; i <= 100; i++)
{
if (i % 2 == 0) //如果i是一个偶数,执行if语句中的代码
{
continue; //结束本次循环
}
sum += i; //实现sum和i的累加
}
循环的嵌套:
#include<stdio.h>
#include <Windows.h>
int main(void)
{
int i , j , k;
for(i = 0;i < 24;i++)
{
for(j = 0;j < 60; j++)
{
for(k = 0; k < 60; k++)
{
printf(" %d: %d : %d\n",i,j,k);
sleep(960);
system("cls");
}
}
}
return 0;
}
编译预处理:
宏定义:使用户能以一个简单的名字代替一个长的字符串,在预编译时将宏名替换成字符串的过程称为“宏展开”;
说明:
- 宏名一般用大写,以便于与变量区别;
- 宏定义可以是常数、表达式等;
- 宏定义不作语法检查,只有在编译被宏展开后的源程序才会报错;
- 宏定义不是C语言,不在行末加分号;
- 宏名有效范围为从定义到本源文件结束;
- 可以用#undef命令终止宏定义的作用域;
- 在宏定义中,可以引用已定义的宏名;
带参数的宏定义: #define SUM(X,Y) ((x)+ (y))
注意:
- 宏的名字中不能有空格,但是在替换的字符串中可以有空格。ANSI C允许在参数列表中使用空格;
- 用括号括住每一个参数,并括住宏的整体定义。
- 用大写字母表示宏的函数名。
如果打算宏代替函数来加快程序运行速度。假如在程序中只使用一次宏对程序的运行时间没有太大提高。
文件包含处理:
意思:一个源文件可以将另外一个文件的全部内容包含进来。C语言提供了#include命令用来实现“文件包含”的操作;
#include<> 与 #include“”的区别:
1. #include <>常用于包含库函数的头文件;
2. #include " "常用于包含自定义的头文件;
3. 理论上#include可以包含任意格式的文件(.c .h等) ,但一般用于头文件的包含;
指针:
内存地址:这个内存编号我们称之为内存地址。内存中的每一个数据都会分配相应的地址:
int类型会分配4个字节,char类型会分配1个字节,以及数组,结构体等等
内存区的每一个字节都有一个编号,这就是地址
指针是内存单元的编号,指针变量是存放地址的变量;
指针变量的定义与使用:
- 指针也是一种数据类型,指针变量也是一种变量
- 指针变量指向谁,就把谁的地址赋值给指针变量
- “*”操作符操作的是指针变量指向的内存空间
所有的指针类型在32位上均为unsigned int 类型在内存中均占4个字节;
值传递,形参不可以改变实参的值,地址传递,形参可以改变实参的值;
数组名作为函数参数: 数组名做函数参数,函数的形参会退化为指针:
void printArrary(int *a, int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d, ", a[i]);
}
printf("\n");
}
指针数组:
数组名是数组的首地址,是一个常量;
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
printf("a = %p\n", a);
printf("&a[0] = %p\n", &a[0]); //数组只是常量不可以修改
加法运算:
- 指针计算不是简单的整数相加
- 如果是一个int *,+1的结果是增加一个int的大小
- 如果是一个char *,+1的结果是增加一个char大小
int a;
int *p = &a;
printf("%d\n",p);
p += 2; //移动两个int类型
printf("%d\n",p);
通过改变指针指向操作数组元素:
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int i = 0;
int n = sizeof(a) / sizeof(a[0]);
int *p = a;
for (i = 0; i < n; i++)
{
/*printf("%d, ", *p);
p++;*/
printf("%d ",*(p+i)); // 两种方式改变其偏移量
printf("%d ",p[i]); //把指针当成数组来使用
}
printf("\n");
指针数组:它是数组,数组的每个元素都是指针类型。
int a = 10;
int b = 34;
int c = 100;
int * arr[3] = {&a,&b,&c};
* arr[1] = 123;
for(int i = 0;i< 3;i++)
{
printf("arr为:%d\n",*arr[i]);
}
多级指针:一级指针接收变量的地址值,二级指针接收一级指针的地址值,同理三级指针接收二级;
int a = 21;
int b = 20;
int *p = &a;
int **p1 = &p;
int *q = &b;
int **q1 = &q;
printf("%d\n",*p);
printf("%d\n",*q);
printf("%d\n",**q1);
printf("%d\n",**p1);