c语言基础
- C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特色迅速在全世界普及和推广。C语言不但执行效率高并且可移植性好,能够用来开发应用软件、驱动、操做系统等。C语言也是其它众多高级语言的鼻祖语言,因此说学习C语言是进入编程世界的必修课。
- helloword
#include<stdio.h>
int main()
{
printf("Hello Word ");
return 0;
}
- 简单来讲,一个C程序就是由若干头文件和函数组成

- #include <stdio.h>就是一条预处理命令,它的做用是通知C语言编译系统在对C程序进行正式编译以前需作一些预处理工做
- 函数就是实现代码逻辑的一个小的单元。
- 注:在最新的C标准中,main函数前的类型为int而不是void
c数据类型
- 标识符:编程时给变量或者函数起的名字就是标识符
- C 语言规定:标识符能够是字母(A~Z,a~z)、数字(0~9)、下划线_组成的字符串,而且第一个字符必须是字母或下划线。
- 标识符时还有注意如下几点:
- (1)标识符的长度最好不要超过8位,由于在某些版本的C中规定标识符前8位有效,当两个标识符前8位相同时,则被认为是同一个标识符。
- (2)标识符是严格区分大小写的
- (3)标识符最好选择有意义的英文单词组成作到"见名知意",不要使用中文
- (4)标识符不能是C语言的关键字
- 例如:

变量及赋值
- 变量就是能够变化的量,而每一个变量都会有一个名字(标识符)。
- 变量占据内存中必定的存储单元。使用变量以前必须先定义变量,
- 要区分变量名和变量值是两个不一样的概念

- 变量定义的通常形式为:数据类型 变量名;
- 多个类型相同的变量:数据类型 变量名, 变量名, 变量名...;

- 注意:在定义中不容许连续赋值,如int a=b=c=5;是不合法的
- 变量的赋值分为两种方式:1.先声明再赋值 2.声明的同时赋值
//先声明,再赋值
int num;
num = 100;
//声明的同时赋值
int x = 10;
基本数据类型
- C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。
- 例如:

- 基本数据类型是最简单也最经常使用的:整型,实型与字符型


- 注:int、short int、long int是根据编译环境的不一样,所取范围不一样。而其中short int和long int至少是表中所写范围,可是int在表中是以16位编译环境写的取值范围。另外 c语言int的取值范围在于他占用的字节数 ,不一样的编译器,规定是不同。ANSI标准定义int是占2个字节,TC是按ANSI标准的,它的int是占2个字节的。可是在VC里,一个int是占4个字节的。
- 浮点数据是指带小数的数字,精度的不一样又分为3种:

不可改变的常量
- 在程序执行过程当中,值不发生改变的量称为常量。C语言的常量能够分为直接常量和符号常量
- 直接常量也称为字面量,是能够直接拿来使用,无需说明的量,好比:
- 整型常量:1三、0、-13;
- 实型常量:13.3三、-24.4;
- 字符常量:‘a’、‘M’
- 字符串常量:”I love you”
- 例如:

- 在C语言中,能够用一个标识符来表示一个常量,称之为符号常量。符号常量在使用以前必须先定义,其通常形式为:
#define 标识符 常量值
- 常量的标示符通常习惯使用大写字母,变量的标示符通常习惯使用小写字母,加以区分。下面是一个使用符号常量的小例子:
#include <stdio.h>
#define PI 3.14 //定义常量及常量值
int main()
{
printf("小明今天又获得%d元零花钱\n",PI );
return 0;
}
自动类型转换
- 自动转换发生在不一样数据类型运算时,在编译的时候自动完成。自动转换遵循的规则就比如小盒子能够放进大盒子里面同样,下图表示了类型自动转换的规则。

#include <stdio.h>
int main()
{
char c = 'a';
int n = c; //将c赋值给n
float f = c; //将c赋值给f
double d = c; //将c赋值给d
printf("%d\n",n);
printf("%f\n",f);
printf("%lf\n",d);
return 0;
}
- 注:字节小的能够向字节大的自动转换,但字节大的不能向字节小的自动转换
强制类型转换
- 强制类型转换是经过定义类型转换运算来实现的。其通常形式为:**(数据类型) (表达式) **
- 例如:
#include <stdio.h>
int main()
{
double num = 2.5; //定义浮点型变量num并赋值为2.5
printf("num的整数部分是%d\n",(int) num);
return 0;
}
- 强制类型转换是应注意如下几点:
- 数据类型和表达式都必须加括号,如把(int)(x/2+y)写成(int)x/2+y则成了把x转换成int型以后再除2再与y相加了
- 转换后不会改变原数据的类型及变量值,只在本次运算中临时性转换。
- 强制转换后的运算结果不遵循四舍五入原则
c语言中运算符
- C语言中的运算是什么?C语言中的运算就是对数据进行操做、处理的过程。那么运算符又干什么的呢?运算符就是指定该运算的处理方式。
- c语言中运算符包括:
- 算术运算符
- 赋值运算符
- 关系运算符
- 逻辑运算符
- 三目运算符
算术运算符

- 注:C语言中没有乘方这个运算符,也不能用×,÷等算术符号。 ### 自增与自减运算符 -自增运算符为“++”,其功能是使变量的值自增1;自减运算符为“--”,其功能是使变量值自减1。它们常用在循环中。自增自减运算符有如下几种形式:
- 注意:不管是a++仍是++a都等同于a=a+1,在表达式执行完毕后a的值都自增了1,不管是a--仍是--a都等同于a=a-1,在表达式执行完毕后a的值都自减小1 -例如:编程
#include <stdio.h>
int main()
{
int x = 0;
printf("x=%d\n",x++);//x=0
printf("x=%d\n",++x);//x=2
return 0;
}
赋值运算符
- C语言中赋值运算符分为简单赋值运算符和复合赋值运算符
- 简单赋值运算符 "="
- 复合赋值运算符就是在简单的运算符“=”以前加上其余运算符如:+=、-=、*=、/=、%=
- 注意:复合运算符中运算符和等号之间是不存在空格的
关系运算符

- 关系表达式的值是“真”和“假”,在c语言中用整数1和0表示
逻辑运算符

- 逻辑运算的值也是有两种分别为“真”和“假”,C语言中用整型的1和0来表示。其求值规则以下:
-
- 与运算(&&)
- 参与运算的两个变量都为真时,结果才为真,不然为假。例如:5>=5 && 7>5 ,运算结果为真;
-
- 或运算(||)
- 参与运算的两个变量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:5>=5||5>8,运算结果为真;
-
- 非运算(!)
- 参与运算的变量为真时,结果为假;参与运算量为假时,结果为真。例如:!(5>8),运算结果为真
三目运算符
- C语言中的三目运算符:“?:”,其格式为: ** 表达式1 ? 表达式2 : 表达式3;**
- 执行过程是:
- 先判断表达式1的值是否为真,若是是真的话执行表达式2;若是是假的话执行表达式3。
#include <stdio.h>
int main()
{
//定义小编兜里的钱
double money = 12 ;
//定义打车回家的费用
double cost = 11.5 ;
printf("小编能不能打车回家呢:");
//输出y小编就打车回家了,输出n小编就不能打车回家
printf( money > cost ? "y" :"n" );
return 0;
}
运算符优先级

- 优先级别为1的优先级最高,优先级别为10的优先级别最低。
- 不必去死记运算符的优先级顺序,记住最高优先级别的,在开发中就会无敌啦
c程序中结构语句
分支结构之简单if语句
if(表达式)
{
执行代码块;
}
- 其语义是:若是表达式的值为真,则执行其后的语句,不然不执行该语句。 其过程可表示为下图:

#include <stdio.h>
int main()
{
int height = 100;
//补全全部代码
if(height >= 180);
{
printf("%s\n","恭喜小明能够参加校篮球队");
}
return 0;
}
### 分支结构之简单if-else语句数组
- 在C语言中就要用到if-else语句了,简单的if-else语句的基本结构以下:
if(表达式)
{
执行代码块1;
}
else
{
执行代码块2;
}
- 其主义是:若是表达式的值为真,则执行代码块1,不然执行代码块2。其执行过程可表示为下图:

- 注意:if()后面没有分号,直接写{},else后面也没有分号,直接写{}
- 例如:
#include <stdio.h>
int main()
{
int year = 2014; //今年是2014年
//补全一下代码
if(year%4 == 0 && year%100 != 0 || year%400 ==0 )
{
printf("%s\n","今年是闰年");
}else{
printf("%s\n","今年是平年");
}
return 0;
}
分支结构之多重if-else语句
- 在C语言中就要用到多重if-else语句,其结构以下:
if(表达式1)
{
执行代码块1;
}
else if(表达式2)
{
执行代码块2;
}
else
{
执行代码块3;
}
- 其语义是:依次判断表达式的值,当出现某个值为真时,则执行对应代码块,不然执行代码块n。 if-else-if语句的执行过程以下图所示:

#include <stdio.h>
int main()
{
int score = 7200;
if(score>=10000)//完善一下代码
{
printf("%s\n","钻石玩家");
}
else if(score>=5000&&score<=10000)
{
printf("%s\n","白金玩家");
}
else if(score>=1000&&score<=5000)
{
printf("%s\n","青铜玩家");
}
else(score<1000)
{
printf("%s\n","普通玩家");
}
return 0;
}
分支结构之嵌套if-else语句
- C语言中嵌套if-else语句。嵌套if-else语句的意思,就是在if-else语句中,再写if-else语句。其通常形式为:
if(表达式)
{
if(表达式)
{
执行代码块
}
else
{
执行代码 块
}
}
else
{
执行代码块
}
- 其执行过程为:

- 例如:
#include <stdio.h>
int main()
{
int results = 98; //results为所考成绩
int ranking = 2; //ranking为所考排名
if(results > 90)
{
if(ranking <= 3)
{
printf("%s\n","吃大餐")
}
else
{
printf("%s\n", "买玩具")
}
}
else
{
printf("%s\n","没有奖励")
}
循环结构之while循环
while(表达式)
{
执行代码块
}
- 其中表达式表示循环条件,执行代码块为循环体。while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体代码块。其执行过程可用下图表示:

- 使用while语句应注意如下几点:
- 一、while语句中的表达式通常是关系表达或逻辑表达式,当表达式的值为假时不执行循环体,反之则循环体一直执行。
- 二、必定要记着在循环体中改变循环变量的值,不然会出现死循环(无休止的执行)。
- 三、循环体若是包括有一个以上的语句,则必须用{}括起来,组成复合语句。
- 例如:
#include <stdio.h>
int main()
{
int i,sum=0;
i=1;
while( i <= 100 ) //循环条件应该是什么呢?
{
sum=sum+i;
i++; //这里是否是应该改变循环变量的值
}
printf("100之内全部整数之和为:%d\n", sum);
return 0;
}
循环结构之do-while循环
do
{
执行代码块
}while(表达式);//注意:这里有分号
- do-while循环语句的语义是:它先执行循环中的执行代码块,而后再判断while中表达式是否为真,若是为真则继续循环;若是为假,则终止循环。所以,do-while循环至少要执行一次循环语句。其执行过程可用下图表示:

- 注意:使用do-while结构语句时,while括号后必须有分号。
- 例如:
#include <stdio.h>
int main()
{
int number=200;
int year=2014;
do{
year++;
number = number * 0.2;
}while(number<1000);
printf("到%d年招工规模突破1000人\n", year);
return 0;
}
循环结构之for循环(一)
for(表达式1;表达式2;表达式3)
{
执行代码块
}
- 执行过程 以下:
- 第一步:执行表达式1,对循环变量作初始化
- 第二步:判断表达式2,若其值为真(非0),则执行for循环体中执行代码块,而后向下执行;若其值为假(0),则结束循环;
- 第三步:执行表达式3;
- 第四步:执行for循环中执行代码块后执行第二步;
- 第五步:循环结束,程序继续向下执行。
- 如图过程:

#include <stdio.h>
int main()
{
// 定义变量sum, num
int sum, num;
sum = 0;
for(num = 0; num <= 10 ; num++ ) //for循环条件与num的变化值
{
sum += num; //计算每次数字之间的和sum
}
printf("10之内数的和为:%d", sum);
return 0;
}
循环结构之for循环(二)
- 在for循环中,表达式1是一个或多个赋值语句,它用来控制变量的初始值;表达式2是一个关系表达式,它决定何时退出循环;表达式3是循环变量的步进值,定义控制循环变量每循环一次后按什么方式变化。这三部分之间用分号(;)分开。
- 使用for语句应该注意:
- 一、for循环中的“表达式一、二、3”都可能够缺省,但分号(;)不能缺省。
- 二、省略“表达式1(循环变量赋初值)”,表示不对循环变量赋初始值。如:

- 三、省略“表达式2(循环条件)”,不作其它处理,循环一直执行(死循环)。如:

- 四、省略“表达式3(循环变量增量)”,不作其余处理,循环一直执行(死循环)。如:

- 注:死循环可使用后面即将讲到的break解决
- 表达式1能够是设置循环变量的初值的赋值表达式,也能够是其余表达式。如:

- 六、表达式1和表达式3能够是一个简单表达式也能够是多个表达式以逗号分割。如:

- 运行结果为:

- 七、表达式2通常是关系表达式或逻辑表达式,但也但是数值表达式或字符表达式,只要其值非零,就执行循环体。

- 八、各表达式中的变量必定要在for循环以前定义。如:

循环结构之三种循环比较
- while、do-while和for三种循环在具体的使用场合上是有区别的,以下:
- 一、在知道循环次数的状况下更适合使用for循环;
- 二、在不知道循环次数的状况下适合使用while或者do-while循环,若是有可能一次都不循环应考虑使用while循环,若是至少循环一次应考虑使用do-while循环
- 可是从本质上讲,while,do-while和for循环之间是能够相互转换的,如:小明被老师罚抄10次computer这个单词,分别用三种语法写:

循环结构之多重循环
- 多重循环就是在循环结构的循环体中又出现循环结构。
- 在实际开发中通常最多用到三层重循环。由于循环层数越多,运行时间越长,程序越复杂,因此通常用2-3层多重循环就能够了。另外不一样循环之间也是能够嵌套的。
- 多重循环在执行的过程当中,外层循环为父循环,内层循环为子循环,父循环一次,子循环须要所有执行完,直到跳出循环。父循环再进入下一次,子循环继续执行...

#include <stdio.h>
int main()
{
int i, j, k;
for(i=1; i<5; i++)
{
/* 观察每行的空格数量,补全循环条件 */
for( j = i; j < 5 ; j++ )
{
printf(" "); //输出空格
}
/* 观察每行*号的数量,补全循环条件 */
for( k = 0 ; k<2*i-1 ; k++ )
{
printf("*"); //每行输出的*号
}
printf("\n"); //每次循环换行
}
return 0;
}
结束语句之break语句
- 在C语言中,可使用break跳出循环,代码实现以下:

- 用break语句时注意如下几点:
- 一、在没有循环结构的状况下,break不能用在单独的if-else语句中
- 二、在多层循环中,一个break语句只跳出当前循环。
结束语句之continue语句
- 在C语言中,可使用continue语句跳出本次循环,代码实现以下:
#include <stdio.h>
int main()
{
int i, sum;
for(i=1, sum=0; i<=20; i++)
{
if( i % 3 == 0 ) //能被3整除这个条件如何写呢?
{
continue; //应该用哪一个循环结束语句呢?
}
sum += i;
}
printf("sum=%d\n", sum);
return 0;
}
- continue语句的做用是结束本次循环开始执行下一次循环。
- break语句与continue语句的区别是:break是跳出当前整个循环,continue结束本次循环开始下一次循环
分支结构之switch语句
- C语言还提供了一种用于多分支选择的switch语句:


- 在使用switch语句时还应注意如下几点:
- 一、在case后的各常量表达式的值不能相同,不然会出现错误。
- 二、在case子句后若是没有break;会一直日后执行一直到遇到break;才会跳出switch语句。
- 例如:

涵数
自定义函数
- C语言提供了大量的库函数,好比stdio.h提供输出函数,可是仍是知足不了咱们开发中的一些逻辑,因此这个时候须要本身定义函数,自定义函数的通常形式:
[数据类型说明] 函数名称([参数])
{
执行代码块;
return (表达式)
}
- 注意:
- 一、[]包含的内容能够省略,数据类型说明省略,默认是int类型函数;参数省略表示该函数是无参函数,参数不省略表示该函数是有参函数;
- 二、函数名称遵循标识符命名规范
- 三、自定义函数尽可能放在main函数以前,若是要放在main函数后面的话,须要在main函数以前先声明自定义函数,声明格式为:[数据类型说明] 函数名称([参数]);
- 例如:
#include <stdio.h>
/* 自定义整型函数 sayLove() */
int sayLove()
{
//在这里输入输出语句printf,输出内容为I Love imooc
printf("%d\n",'love');
return 0;
}
/* 自定义整型函数 dividLine() */
int dividLine()
{
printf("%s\n", "*************");
return 0;
}
/* 主函数 */
int main()
{
return 0;
}
函数的调用
函数名([参数]);
- 注意:
- 一、对无参函数调用的时候能够将[]包含的省略。
- 二、[]中能够是常数,变量或其它构造类型数据及表达式,个参数之间用逗号分隔
- 例如:
#include <stdio.h>
/* 自定义整型函数 sayLove() */
int sayLove()
{
//在这里输入输出语句printf,输出内容为I Love imooc
printf("%s\n", "Love");
return 0;
}
/* 自定义整型函数 dividLine() */
int dividLine()
{
printf("%s\n", "*************");
return 0;
}
/* 主函数 */
int main()
{
/* 调用所写函数 */
sayLove();
dividLine();
return 0;
}
有参数和无参数

- 有参函数和无参函数的惟一区别在于:函数()中多了一个参数列表。
- 例如:

形参与实参
- 形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数
- 实参是在调用时传递该函数的参数
- 函数的形参和实参具备如下特色:
- 形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。所以,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
- 实参能够是常量、变量、表达式、函数等,不管实参是何种类型的量,在进行函数调用时,它们都必须具备肯定的值,以便把这些值传送给形参。所以应预先用赋值等办法使实参得到肯定值。
- 在参数传递时,实参和形参在数量上,类型上,顺序上应严格一致,不然会发生类型不匹配”的错误。
- 例如:
#include <stdio.h>
int getGirth(int a,int b,int c)
{
if( (a+b)<=c || (a+c)<=b || (b+c)<=a ) //判断是否为三角形
{
printf("不构成三角形\n");
return 0;
}
else
{
int cirf = a + b + c ; //计算三角形周长
return cirf;
}
}
int main()
{
/* 定义三角形三边长 */
int a, b, c;
a = 3;
b = 4;
c = 5;
printf("三角形的周长是:%d\n", getGirth(a,b,c)); //调用周长函数
return 0;
}
函数的返回值
- 函数的返回值是指函数被调用以后,执行函数体中的程序段所取得的并返回给主调函数的值。
- 函数的返回值要注意如下几点:
-
- 函数的值只能经过return语句返回主调函数。return语句的通常形式为:
return 表达式 或者为: return (表达式);
-
- 函数值的类型和函数定义中函数的类型应保持一致。若是二者不一致,则以函数返回类型为准,自动进行类型转换。
- 例如:
返回一个字符型数据,用代码表示就是
char option()
{
return 'A'
}
int number()
{
return 100;
}
void noResult()
{
执行代码块
}
- 注意:void函数中能够有执行代码块,可是不能有返回值,另void函数中若是有return语句,该语句只能起到结束函数运行的功能。其格式为:return;
递归函数
- 递归就是一个函数在它的函数体内调用它自身
- 例如:计算n的阶乘可使用如下代码:
#include <stdio.h>
int factorial(int n){
int result;
if(n < 0)
{
printf("输入错误!");
return 0;
}
else if(n == 0 || n == 1)
{
result = 1;
}
else
{
result = factorial(n - 1) * n;
}
return result;
}
int main()
{
int n = 5;
printf("%d的阶乘=%d", n, factorial(n));
return 0;
}
局部变量和全局变量
- 局部变量也称为内部变量,做用域仅限于函数内
- 全局变量也称为外部变量,其做用域是整个源程序
- 例如:
#include <stdio.h>
int x = 1;//全局变量
int fn1(int x){
int y,z;//局部变量
z = 2;
y = x+z;
printf("y=%d\n", y);
return 0;
}
int main()
{
fn1(2)l//输出4
int y = 10;
printf("x+y=%d", y+x);//输出11
return 0;
}
数组
- 如何声明一个数组:
- 数据类型 数组名称[长度];
- C语言中的数组初始化是有三种形式的,分别是:
- 一、 数据类型 数组名称[长度n] = {元素1,元素2…元素n};
- 二、 数据类型 数组名称[] = {元素1,元素2…元素n};
- 三、 数据类型 数组名称[长度n]; 数组名称[0] = 元素1; 数组名称[1] = 元素2; 数组名称[n-1] = 元素n;
- 获取数组
- 取数组元素时: 数组名称[元素所对应下标];
- 例如:
- 如:初始化一个数组 int arr[3] = {1,2,3}; 那么arr[0]就是元素1。
- 注意:
- 一、数组的下标均以0开始;
- 二、数组在初始化的时候,数组内元素的个数不能大于声明的数组长度;
- 三、若是采用第一种初始化方式,元素个数小于数组的长度时,多余的数组元素初始化为0;
- 四、在声明数组后没有进行初始化的时候,静态(static)和外部(extern)类型的数组元素初始化元素为0,自动(auto)类型的数组的元素初始化值不肯定。
- 例如:
#include <stdio.h>
int main()
{
//第一种形式
int arrFirst[3] ={1,2,4};
//第二种形式
int arrSecond[] ={1,2,3};
//第三种形式
int arrThird[3];
//给arrThird数组每一个元素初始化
arrThird[0] = 1;
arrThird[1] = 2;
arrThird[2] = 3;
//输出第一个数组中的第二个元素
printf("%d\n",arrFirst[1]);
//输出第二个数组中的第二个元素
printf("%d\n", arrSecond[1]);
//输出第三个数组中的第二个元素
printf("%d\n", arrThird[1]);
return 0;
}
数组的遍历
- 数组遍历时要注意如下几点:
- 一、最好避免出现数组越界访问,循环变量最好不要超出数组的长度,好比:

- 二、C语言的数组长度一经声明,长度就是固定,没法改变,而且C语言并不提供计算数组长度的方法。
- 因为C语言是没有检查数组长度改变或者数组越界的这个机制,可能会在编辑器中编译并经过,可是结果就不能确定了,所以仍是不要越界或者改变数组的长度
- 例如:
#include <stdio.h>
int main()
{
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
//补全代码实现对数组arr的遍历
int i;
for( i = 0; i < 10; i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
数组做为函数参数
- 一、整个数组看成函数参数,即把数组名称传入函数中,例如:

- 二、数组中的元素看成函数参数,即把数组中的参数传入函数中,例如:

- 数组做为函数参数时注意如下事项:
- 一、数组名做为函数实参传递时,函数定义处做为接收参数的数组类型形参既能够指定长度也能够不指定长度。
- 二、数组元素做为函数实参传递时,数组元素类型必须与形参数据类型一致。
- 例如:
#include <stdio.h>
void Maxs(int arr[], int value)
{
int max = arr[0];
int index = 0;
int i;
for(i=1;i<5;i++){
if(arr[i]>max){
max = arr[i];
index = i;
}
}
arr[index] = value;
}
int main()
{
int arr1[] = {1,2,3,4,5};
int arr2[] = {10,20,30,40,50};
int i;
Maxs(arr1,arr2[0]);
for(i=0;i<5;i++){
printf("%d\n", arr1[i]);
}
return 0;
}
字符串与数组
- 在C语言中,是没有办法直接定义字符串数据类型的
- 用数组来定义字符串有如下两种格式:
- 一、char 字符串名称[长度] = "字符串值";
- 二、char 字符串名称[长度] = {'字符1','字符2',...,'字符n','\0'}; 注意:
- 一、[]中的长度是能够省略不写的;
- 二、采用第2种方式的时候最后一个元素必须是'\0','\0'表示字符串的结束标志;
- 三、采用第2种方式的时候在数组中不能写中文。
- 在输出字符串的时候要使用:printf(“%s”,字符数组名字);或者puts(字符数组名字);。例如:
#include <stdio.h>
/* 定义say函数 */
void say(char string[]) //数组参数应该怎么写呢?
{
printf(" %s \n ",string); //打印字符串
}
int main()
{
//定义字符串数组
char string[] = "l love you";
char str2 = {"i","love","you","\0"};
say(string);
say(str2);
return 0;
}
字符串函数

- 使用字符串函数注意如下事项:
- 一、strlen()获取字符串的长度,在字符串长度中是不包括‘\0’并且汉字和字母的长度是不同的。好比:
char str1[] = '小样你';
char str2[] = {'i','l','o','e','\0'};
printf("字符串str1长度=%d\n",strlen(str1));//9
printf("字符串str1长度=%d\n",strlen(str2));//4
}
- 二、strcmp()在比较的时候会把字符串先转换成ASCII码再进行比较,返回的结果为0表示s1和s2的ASCII码相等,返回结果为1表示s1比s2的ASCII码大,返回结果为-1表示s1比s2的ASCII码小,例如:

- 三、strcpy()拷贝以后会覆盖原来字符串且不能对字符串常量进行拷贝,好比:
#include <stdio.h>
int main()
{
char str1[] = "love";
strcpy(str1,"i love you");
printf("%s\n",str1);
}
- 四、strcat在使用时s1与s2指的内存空间不能重叠,且s1要有足够的空间来容纳要复制的字符串,如:

多维数组
- 多维数组的定义格式是:
- 数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n];
- 例如:

- 定义了一个名称为num,数据类型为int的二维数组。其中第一个[3]表示第一维下标的长度,第二个[3]表示第二维下标的长度 如图:

- 多维数组的初始化与一维数组的初始化相似也是分两种:
- 一、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
- 二、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n]; 数组名称[下标1][下标2]...[下标n] = 值;
- 多维数组初始化要注意如下事项:
- 一、采用第一种始化时数组声明必须指定列的维数。由于系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数;
- 二、采用第二种初始化时数组声明必须同时指定行和列的维数。
- 例如:
#include <stdio.h>
void print(int arr[2][2])
{
int i,j;
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
}
int main()
{
//使用第一种方式初始化方式声明并初始化二维数组arr1
int arr1[2][2]={{10,20},{30,40}};
print(arr1);
printf("*****\n");
//使用第二种方式初始化方式声明并初始化二维数组arr2
int arr2[2][2];
arr2[0][0]=10;
arr2[0][1]=20;
arr2[1][0]=30;
arr2[1][1]=40;
print(arr2);
return 0;
}