内容简介:
1、数组
2、字符串
3、函数(声明与定义,rand函数)
4、递归
5、预编译
6、宏定义(带参数/不带参数)
一、数组
语法定义:
类型
数组名
[
元素个数
]
数组声明: int a[5];
注意:类型必须一致
[ ] 必须是常量,绝对不能使用变量
初始化:定义数组时初始化元素
先定义数组变量,再初始化元素
遍历数组:把数组中的元素都取出来
数组声明: int a[5];
注意:类型必须一致
[ ] 必须是常量,绝对不能使用变量
初始化:定义数组时初始化元素
先定义数组变量,再初始化元素
遍历数组:把数组中的元素都取出来
计算数组a中元素个数:
int count = sizeof( a ) / sizeof( int );
二维数组:
//定义:3表示数组中元素个数,2 表示里面二维数组的个数
int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
printf(“value is %d \n”,a[1][0]); //3
二、字符串
用字符数组存储字符串
“\0”
表示字符串结束
char str[ ] = “”;
计算字符串中字符的个数
:int length = strlen(str);
【1】字符串数组的初始化:
(1)char a[3] = {‘x’, ‘y’, ‘\0’};
(2)char b[3] ;
b[0] = ‘x’; b[1] = ‘y’; b[2] = ‘\0’;
(3)char c[3] = “xy”;
(4)char *d = “xy”;
//指针类型 //这种要获取长度的话,无论字符串多长,
他所得的结果均为8;因为他获得的是
指针所占字节长度,指针指向字符串所在地址。
【2】获取字符串的长度:
(1)int len = sizeof( str ) / sizeof( char ) -1;
(2)int len = ( int ) strlen ( str );
【3】字符串的遍历:
char str = “hello world”;
(方法1)int len = sizeof( str ) / sizeof( char ) -1;
for(int i = 0; i < len; i++){
printf(“%c ”,str[ i ] );
}
(方法2)导入头文件:#include <string.h>
int len = ( int ) strlen ( str );
三、函数
1、 函数的定义:
返回值类型
函数名
(
形参列表
)
{
函数体
函数体
}
// 注意:
(1)函数名称通常以小写字母开头
(2)函数被调用时,形参会被分配内存,使用完后,内存被栈内存回收
(3)函数的定义是不能重复的,只可以定义一次
(4)函数可以没有返回值和形参,但必须要有( )
(5)
若函数没有返回值,则用void 表示返回类型
(6)返回值为void时,可不写return;若要写,
return后面不带任何值,只加“;”结尾
(7)
return标志函数结束,
return后面的语句将不再执行
(8)在函数体中,不能再嵌套定义函数。
(9)默认情况下,函数名不能重复定义,即使类型不一样也不行
2、
声明函数: //告诉编译器在后面有这样一个函数
int sum(int a, int b); //声明
int sum(int a, int b) { …} //定义
//
注意:
(1)函数只能定义一次,但可以
声明多次
,
声明的尾部要添加分号
,
(2)
声明时的形参可以与定义的时候形参不一样,甚至可以没有
(3)只有前面声明过的函数才能被后面的函数调用
(4)可以在前面声明函数,在后面定义函数
(5)在C语言中,在.C文件中定义函数实现,在 .h文件中定义函数声明
多文件开发 头文件
二、rand
函数
产生随机数,需要导入
<stdlib.h>
头文件
//
产生随机数,需要导入头文件:
#include <stdlib.h>
int random = rand () % 10 ;
// 运行的结果总是一样的
// 所以,取随机值,我们通常会设置随机种子,一般以时间为种子
// 这种方法要导入头文件: #include <time.h>
srand (( unsigned ) time ( NULL )); // 注意: NULL 必须大写!!!
for ( int i = 0 ; i < 10 ; i++) {
int random = rand () % 10 ; // %10 ,表示随机取 [0 , 10 )间的整数
printf ( "rand is %d \n" ,random);
}
// 方法二:不需设置时间种子
int random = arc4random () % 10 ; //arc4random() 表示随机取值不重复
int random = rand () % 10 ;
// 运行的结果总是一样的
// 所以,取随机值,我们通常会设置随机种子,一般以时间为种子
// 这种方法要导入头文件: #include <time.h>
srand (( unsigned ) time ( NULL )); // 注意: NULL 必须大写!!!
for ( int i = 0 ; i < 10 ; i++) {
int random = rand () % 10 ; // %10 ,表示随机取 [0 , 10 )间的整数
printf ( "rand is %d \n" ,random);
}
// 方法二:不需设置时间种子
int random = arc4random () % 10 ; //arc4random() 表示随机取值不重复
printf("rand is %d \n",random);
四、递归调用
当前函数调用自己
注意:在递归调用时,应该有跳出条件,满足条件时,使用
return
跳出函数
阶乘:
int jiecheng( int value){
if( value == 1){
return value;
}
return value * jiecheng(value - 1);
}
五、预处理
#include <> && #include “ “
(1)#include <>
直接在系统目录下查找文件,一般库文件使用此种方式,标准查找
(2)#include “ “
先在当前编译目录下查找文件,若没有,再到系统目录下查找
六、宏定义
【1】不带参数宏定义
语法定义:#define 宏名 宏内容
#define PI 3.14
(1)宏名一般全用
大写字母(与变量名区分,或小写
k
开头),但小写也没语法错误
(2)
宏内容尽量用括号
(3)对程序中用“ ” 括起来的字符串内的内容,不进行宏的替换操作
(4)
在编译之前,预处理时将程序中所有宏名替换成右边的宏内容
(5)
宏名的作用域:从定义位置到文件结束。如需要终止宏定义,可用
#undef 宏名
【2】带参数的宏定义
#define
宏名 (参数列表) 表达式
#define average(a, b) (a + b) / 2
使用:int a =
average(1, 3);
{1}注意:
(1)宏名与参数之间不能有空格,
(2)表达式里面要带参数,否则无意义
{2}与函数的区别:
(1)宏定义不涉及参数类型匹配、参数传递、返回值问题
(2)函数调用在程序运行时执行,宏替换只在编译预处理阶段进行
所以,带参数的宏(执行效率) > 函数
三、条件编译
(1)在预编译时,根据条件选择编译代码。//不满足条件时,根本不会编译
(2)注意:是编译进去,不是执行,和 if—else不一样
(3)
使用条件编译,编译的条件变量只能是整型或字符型
(4)如无输出之类,条件编译可以写到main函数外面。
#define MAX 11
int main ( ){
//条件编译:
#if MAX == 0
printf(“ MAX is 0 \n”);
#elif MAX > 0 //<====>else if
printf(“ MAX > 0 \n”);
#else MAX < 0
printf(“ MAX < 0 \n”);
#endif
}
//判断MAX是否定义,如果定义了,条件为真:
#if defined( MAX ) <====> #ifdef MAX
#endif
//判断MAX是否定义,如果定义了,条件为假:
#if !defined( MAX ) <====> #ifndef MAX
#endif