函数
函数的原型声明//可以不带参数名称但是要有参数类型 void swap(void);
函数定义
函数的返回类型
void sum(int begin,int end){...; return ...;}
函数调用
传值:传值给函数!!!
每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系
本地变量:
定义在函数内部的变量就是本地变量,参数也是本地变量。
本地变量就是定义在块内的,可以是函数,语句的块内,甚至是随便拉一对大括号。
离开这个块,其中的变量消失!!!
变量的生存期,作用域
字符类型:
char是一种整数,也是一种特殊的类型:字符
字符在计算机内部都有一个值去表达它,这个值是可以以整数形式得到的。
字符计算
逃逸字符(转义字符)
数组
编译器和运行环境都不会检查数组是否越界,越界访问可能造成程序崩溃!
定义数组:
int grades[100];//指定大小时候必须为整数!
数组是一个容器;一旦创建不能改变大小。所有元素相同的数据类型。
数组初始化
数组遍历
数组变量本身不能被赋值。要想把一个数组元素交给另一个数组,可以用遍历。
数组作为函数参数时往往必须用另一个参数来传入数组大小!int sum(int n,int a[]){...}
二维数组:
int a[3][5];//a是一个3行5列的矩阵
a[i][j] 不等于 a[i,j] (逗号是一个运算符,i,j是一个表达式)
二维数组初始化
二维数组遍历(两层for循环)
字符数组:char word[]={'a','b'};
字符串:char word[]={'a','b','\0'};//字符串也就是以0或者\0结尾的一串字符。0标志字符串结束,并不是字符串的一部分。
字符串以数组的形式存在,以数组或者指针的形式访问。string.h里面有很多处理字符串的函数。
字符串变量:
cahr* str="helllo";
C语言的字符串以字符数组的形态存在,不能用运算符对字符串做运算。可以通过数组的方式遍历字符串。
字符串输入输出:
char str[8];
scanf("%s",str);
scanf("%7s",str);//只接受7个字符,多出的内容会交给下一个scanf
字符串函数:
strlen
strcmp
strcpy 拷贝
strcat 连接
strchr 找字符第一次出现位置
strstr
地址:
sizeof(...)占了多少字节,sizeof(int)=4,sizeof(double)=8
&运算符用来获得变量的地址。printf("%p",&i);//不要写成%d
先写的变量地址更高,后写的变量地址更低。(从上到下放,从高到低)
数组地址:
int a[5];
数组名本身a是一个地址。printf("%p",a)
a[0],a[1],...是元素,取地址加&
&a与a与&(a[0])的结果是一样的。 &a==a
指针变量:
int *p,*q;//p,q都是指针变量 int *p,q;//q是int变量!
指针变量的值是具有实际值的变量的地址。
作为参数的指针:void f(int*p);调用:f(&i);
scanf("%d",&i);如果少了&,会把i当成地址,结果出错
*运算符:用来访问指针的值所表示的地址上的变量
函数参数表中的数组实际上是指针!但是可以用数组的运算符进行运算。sizeof(a)==sizeof(int*)
数组变量是特殊的地址。*运算符可以对指针做,也可以对数组做。
等价的定义:
int sum(int*arr,int n);
int sum(int arr[],int n);
数组变量是const的指针,不能赋值!int a[],即 int* const a