二维数组
1.定义
<存储类型><数据类型><数组名>[常量表达式][常量表达式]
特别注意的是,在C语言中,二维数组内存中存放的顺序是按行存放的,就是先顺序存放第一行再存放第二行,以此类推。同时,要注意的是二维数组可以省略行。
2.二维数组初始化
(1)降维给二维数组赋初值,即按行初始化:
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
(2)按线性存储形式给二维数组赋初值:
int a[3][3]={1,2,3,4,5,6,7,8,9};
(3)省略左边下标范围的方式:
int a[][3]={{1,2,3},{1,2,3},{1,2,3}};
典型例题:有一个3x4的二维数组,要求输出其最大的元素的值和该元素值的行号和列号。
字符串数组
1.定义
字符串指的是以'\0'作为结束字符的一组字符,在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。特别要注意的是,在字符串中,'\0'作为字符串的结束符标志。
2.字符串的初始化
char a[6]={'a','b','c','d','e','\0'};
外部输入读取:
字符串外部输入读取时候,字符串的头文件 #include<string.
3.字符串的输入输出
逐个字符输入输出,用格式符%c输入或者输出一个字符。整个字符串一次性输入或者输出,用%s格式符。
char c[ ]="nanjing";
printf("%s",c);
也可以用puts和gets函数:
gets(字符数组):其作用是将一个字符串输出到终端。
puts(字符数组):其作用是从终端输入一个字符串到字符数组,并得到一个函数值。
4.strcat函数
strcat函数又被称为是字符串追加/连接函数,它的功能就是在一个字符串后面追加上另外一个字符串。
特别要注意的是明确实现的思路:找到目标字符串中的‘\0’以及将字符串src追加过去(包含’\0’)
5.strlen函数
该函数从第一个字符开始计算字符串中字符数,直到遇到空字符即'\0'为止,然后返回计算字符数的长度,包括'\0'。
6.strcmp函数
strcmp函数语法为“int strcmp(char *str1,char *str2)”,其作用是比较字符串str1和str2是否相同,如果相同则返回0,如果不同,前者大于后者则返回1,否则返回-1。
函数
1.函数的定义
函数是一个完成特定功能的代码模块,通常有参数,也可以没有参数,通常要求返回值,也可以是空值。
<数据类型><函数名称>(<形式参数说明>)
{
语句序列;
return (表达式);
}
函数名称:这是函数的实际名称,函数名和参数列表一起构成函数签名。
参数:参数经销商占位符,当函数被调用时,向参数传递一个值,这个值被称为实际参数。
2.函数的声明
函数的声明会告诉编译器函数名称及如何调用函数,函数的实际主体可以单独定义。
函数类型 函数名(参数类型1,参数类型2...);
函数类型 函数名(参数类型1, 参数名,参数类型2,参数名2...);
3.函数的调用
函数的使用也叫函数的调用:
函数名称(<实际参数>)
函数名称是一个标识符,符合标识符的命名规则;
实际参数:需要确切的数据,也可以具有确定值的表达式。
4.函数的嵌套调用
C语言的函数定义是互相平行的,独立的,也就是说,在定义函数时,一个函数内不能定义另一个函数,也就是不能嵌套函数定义,但是可以嵌套调用函数,也就是说,在调用一个函数的过程中,可以调用另一个函数。
5.函数的递归调用
递归调用:在调用一个函数的过程中又出现直接或间接的调用该函数本身,称为函数的递归调用。
这种调用都是无终止的调用,显然程序中不可能出现这种状况,而是应该出现有限次数的、有终止的递归调用、这可以用if语句来控制。
经典例题:
#include <stdio.h>
int fun(int m)
{
if(m<0)
{
return -1;
}
else if(m==0||m==1)
{
return 1;
}
else
{
return m*fun(m-1);
}
}
int main()
{
int m;
printf("input m: ");
scanf("%d",&m);
ret=fun(m);
printf("1!+2!+...+%d!=%d\n",m,ret);
return 0;
}
斐波那契数列:
#include<stdio.h>
int fun(int n)
{
if(n==0||n==1)
{
return 1;
}
else
{
return fun(n-2)+fun(n-1);
}
}
int main()
{
int n,ret;
printf("input n: ");
scanf("%d",&n);
for(i=0;i<=m;i++)
{
ret=fun(i);
printf("fun(%d)=%d\n",i,ret);
}
return 0;
}
6. 数组与函数
数组元素作为函数实参:数组元数可以作为函数实参,不能作为函数形参。因为形参是在函数被调用时临时分配的存储单元,不可能作为一个数组元素单独分配存储单元(数组是一个整体,在内存中连续的一段存储单元)。在用数组元素作为函数实参时,把实参的值传给形参,是值传递的方式。
经典例题:输入10个数,要求输出其中最大的元素和该数是第几个数。
#include<stdio.h>
void fun(int b[],int n)
{
int max=b[0],row=0;
for(int j=0;j<n;j++)
{
if(max<b[j])
{
max=b[j];
row=j+1;
}
}
printf("最大值数在第%d个,max=%d\n",row,max);
}
int main()
{
int a[10];
for(int i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
fun(a,10);
return 0;
}