一、循环
for(表达式1;表达式2;表达式3)
表达式1:初始化,只执行一次;表达式2:判断条件,结束条件,没有结束条件会出现死循环。
初始化——>判断条件——>执行for内语句,表达式3——>条件判定
逗号表达式:先执行表达式1,后执行表达式2,最终结果为表达式2
continue: 作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定
break:可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句
注意:break语句不能用于循环语句和switch语句之外的任何其他语句中
二、数组
(1)一维数组
一维数组的定义格式为:类型说明符 数组名[常量表达式];
数组在内存中是连续的,例:float a[100],每个float类型占4个字节,数组a中有100个元素,所以数组a占400个字节。
在定义数组时对数组元素赋以初值。例如:int a[10]={0,1,2,3,4,5,6,7,8,9};
可以只给一部分元素赋值。例如: int a[10]={0,1,2,3,4};
定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。
在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:int a[5]={1,2,3,4,5};
也可以写成 int a[]={1,2,3,4,5};
重点:a表示数组首元素地址,a+1表示下一个元素的地址,步长为一个元素;
&a数组地址,&a+1下一个数组,步长为一个数组
求数组长度:sizeof(a) / sizeof(a[0])
int main()
{
int a[4]={0};
printf("%d\n", sizeof(a));
printf("%d\n", a);
printf("%d\n", &a);
printf("%d\n", a+1);
printf("%d\n", &a+1);
return 0;
}
例:冒泡排序
#include <stdio.h>
#define SIZE 5
{
int i, j, t;
int a[SIZE];
printf("please input numbers:\n");
for(i = 0; i < SIZE; i++)
scanf("%d", &a[i]);
for(i = 0; i < SIZE-1; i++)
for(j = 0; j < SIZE - i - 1; j++)
{
if(a[j] < a[j-1])
{
t = a[j];
a[j] = a[j-1];
a[j-1] = t;
}
}
}
(2)二维数组
4种方法对二维数组初始化:
分行给二维数组赋初值。例如: int a[3][4]={{1,2,3,4},{5,6,7,8}, {9,10,11,12}};
可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。
例如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
可以对部分元素赋初值。
例如: int a[3][4]={{1}, {5}, {9}};也可以对各行中的某一元素赋初值,如int a[3][4]={{1}, {0,6}, {0, 0, 0, 11}};
如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
例如:int a[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};等价于:int a[ ][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
重点:
①a:表示首行地址,a+1加一行;
②&a数组地址,&a+1加一个数组;
③a[0]首元素地址,a[0]+1加一个元素;
④*a:(=a[0]),a[0]+1:(=*a+1)
表示地址a[1] = *(a+1)
(3)字符数组
为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”——‘\0’
字符数组的输入输出可以有两种方法:
逐个字符输入输出。用格式符“%c”输入或输出一个字符
将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输出
说明:
用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名
如果数组长度大于字符串实际长度,也只输出到遇′\0′结束
输出字符不包括结束符′\0’
如果一个字符数组中包含一个以上′\0′,则遇第一个′\0′时输出就结束
可以用scanf函数输入一个字符串
例:在字符串指定位置插入字符
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
{
char a[20] = {0};
char x;
int num, i, length;
printf("input :\n");
scanf("%s%d %c", a, &num, &x);
length = strlen(a);
if(num <= 0 || num > length)
{
printf("ERROR!\n");
exit(1);
}
for(i = 0; i< SIZE - num +1; i++)
{
a[SIZE - i] = a[SIZE - i - 1];
}
a[num -1] = x;
printf("%s\n", a);
return 0;
}
字符串处理函数:
strcat(str, ptr)将字符串ptr连接到str后;
strcpy(str, ptr)将ptr复制到(覆盖) str,'\0'也被复制过去;
注:(1)字符数组1必须定义得足够大,以便容纳被复制的字符串,字符数组1的长度不应小于字符串2的长度
(2)“字符数组1”必须写成数组名形式(如str1)
(3)不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如:str1=″China″; 不合法 str1=str2; 不合法
用strcpy函数只能将一个字符串复制到另一个字符数组中去;用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。
“字符串2”可以是字符数组名,也可以是一个字符串常量如:strcpy(str1,″China″);
strcpy(str, ptr, n)只复制ptr中n个字符过去;
strcmp(str, ptr)比较字符串1和字符串2
如果str=ptr,strcmp(str,ptr)为0; str>ptr,函数值>0;如果str<ptr,函数值<0
三、函数
步骤:通过函数名找到函数入口地址;为形参分配空间;传值(值传递、地址传递);执行函数体;返回;释放空间
Linux执行程序时,为每个进程分配4个G虚拟空间:内核态1G,用户态3G,用户态中有数据段:存放全局变量、被static修饰的
变量,其中BBS存放静态未初始化变量;代码段:存放代码和常量;栈空间:局部变量;堆空间:程序员向内存申请空间malloc
①寄存器变量:register int x;说明变量x不放在内存中,放在寄存器中;寄存器变量不能取地址;对于使用频繁的变量,可以使用
register声明为寄存器变量,其值存储在CPU中,加快了运行速度
②用static修饰的变量:
static修饰全局变量,改变全局变量作用域,该变量只能在本文件中使用,不能在其他文件中使用
static修饰函数,改变函数作用域,函数只能在本文件中被调用
static修饰局部变量,改变变量生命周期,只初始化一次,知道程序运行结束才被释放
预处理:
①文件包含:#include "stdio.h" 在当前目录和TC指定的目录中找该文件,自定义头文件
#include <stdio.h> 在由TC指定的文件目录中找该文件
②使用预处理注销代码
#if 0
……
#endif
③宏函数:#define OUT printf("hello\n")