一维数组、可变长数组、多维数组以及函数
二维数组
二维数组名称也可以代表数组里第一个存储区的地址,二维数组名称也不可以被赋值。二维数组名称也可以进行sizeof计算,结果是二维数组里所有存储区的总大小。
二维数组名称后可以只使用一个下标,这个下标当作组下标使用,这个写法可以表示下标对应组里第一个存储区的地址,这个写法可以当作一维数组使用,这个一维数组里包含下标对应组里所有的存储区。
练习:
30104
03140
22022
04130
40103
将这些数据填入二维数组中,并打印出来,只能初始化0
练习:扫雷游戏雏形
函数
C语言里允许使用分组的方式管理程序里的语句,每个语句分组叫做一个函数,
func1 *****
func **** ****
main ******* *********
多函数程序执行时的时间分配情况遵守以下规则
1.这个程序的执行时间被分成几段,不同时间段被分配给不同的函数使用。
2.任何两个时间段不能相互重叠并且所有时间段必须连续。
3.如果函数A把自己的时间分配给函数B使用则函数B完成所有工作后必须把后面的时间还给函数A。
如果函数A把自己的时间分配给函数B使用则他们之间存在函数调用关系;在这个调用关系中函数A叫做调用函数,函数B叫做被调用函数, 只有被调用函数工作期间函数调用关系才存在,调用函数里编写函数调用语句会在函数间产生函数调用关系。
不可以跨函数使用变量,不同函数里的变量可以重名。如果函数多次执行则每次执行的时候函数里面的变量对应的存储区都可能不同。
volatile关键字
使用volatile关键字声明的变量对应的存储区内容可以被其他程序修改(用这个关键字声明的变量即使被其他程序修改了,你也能拿到真实的数字)。
函数调用
函数调用过程中通常伴随着两个函数之间数据的传递,数据传递存在两个完全相反的方向,既可以从函数调用向被调用函数传递也可以从被调用函数向调用函数传递。
被调用向调用传递数据
无论那个方向的数据传递都需要使用被调用函数提供的存储区。只能从被调用函数向调用函数传递一个数据,这个数据叫做被调用函数的返回值,只能在被调用函数结束的时候才能向调用函数传递返回值,返回值必须存放在被调用函数提供的一个存储区里,这个存储区的类型名称应该写在被调用函数名称前面,被调用函数里使用return关键字把返回值记录到存储区里。
调用函数里把函数调用语句当作数字使用就可以获得被调用函数的返回值。
练习:编写函数从键盘得到两个整数,计算它们的和并把结果传递给调用函数。
如果被调函数没有使用return关键字设置返回值则函数的返回值是随机的,调用函数只有一次获得返回值的机会,得到以后或者立刻使用或者存储到某个存储区里。
如果函数名称前写void表示函数不提供存放返回值的存储区,如果函数名称前什么都不写在C89规范里表示函数提供一个整数类型存储区用来存放返回值,C99规范里不允许这样。被调用函数不可以使用数组记录返回值,
调用向被调用传递数据
可以从调用函数向被调用函数传递多个数据,这些数据的类型可以不同,被调用函数需要为每个数据提供一个对应的存储区,需要在函数名称后面的小括号里声明一组变量,用他们表示前面提到的存储区,这些变量叫做函数的形式参数,小括号里所有的内容叫做函数的形式参数列表,每个形式参数的类型名称都不可以省略。
相邻的形式参数声明之间用逗号分开,被调用函数里可以像使用变量一样使用这些形式参数,调用带参数的函数时需要在函数调用语句的小括号里为每个形式参数提供一个对应的数字。计算机把这些数字记录在对应的形式参数里,被调用函数可以通过形式参数得到这些数字,这些数字叫做实际参数。
只要能当数字使用的内容都可以作为实际参数使用。如果函数不提供形式参数就应该在函数名称后的小括号里写void。如果函数名称后面小括号里什么都没写,这不表示函数没有形式参数,而表示函数可以提供任意多个不确定类型的形式参数。
练习:编写函数从调用函数得到头和脚的数量然后把兔子的数量计算出来并传递给调用函数。
点击查看代码
#if 0
/*
*
*二维数组
*
* */
#include<stdio.h>
int main (){
int arr[3][2] = {0};
printf("arr=%p\n",arr);
printf("arr[0][0]=%p\n",&arr[0][0]);
printf("arr=%ld\n",sizeof(arr));
printf("arr[1]=%p\n",&arr[1]);
printf("arr[][]=%p\n",&arr[1][0]);
return 0;
}
#elif 0
/*
*
* 二维数组练习
*
* */
#include<stdio.h>
int main (){
int arr[5][5] = {0};
int col = 0,row = 0;
for (row = 0;row <= 4;row++){
for (col = 0;col <= 4;col++){
if (col == 2){
arr[row][col] = 1;
}
else if (row == 2){
arr[row][col] = 2;
}
else if (row == col){
arr[row][col] = 3;
}
else if ((col + row) == 4){
arr[row][col] = 4;
}
}
}
arr[2][2] = 0;
for (row = 0;row <= 4;row++){
for (col =0;col <= 4;col++){
printf(" %d",arr[row][col]);
}
printf("\n");
}
return 0;
}
#elif 0
/*
*
*扫雷游戏(10x10)
*
* */
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main (){
char map[10][10] = {0};
int delta[][2] = {-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
int row = 0,col = 0,cnt = 0,num = 0;
int trow = 0,tcol = 0;
srand(time(0)); //产生地雷
do {
row = rand() % 10;
col = rand() % 10;
if (!(map[row][col] & 15)){ //保证埋雷的地方没有地雷,最后面四位数为0
map[row][col] |= 15; //后四位一定是1
cnt++; //cnt表示地雷个数
}
}while(cnt < 10);
for (row = 0;row <= 9;row++){
for (col = 0;col <= 9;col++){
if ((map[row][col] & 15) != 15){
continue;
}
for (num = 0;num <= 7;num++){
trow = row + delta[num][0];
tcol = col + delta[num][1];
if (trow < 0 || trow > 9){
continue;
}
if (tcol < 0 || tcol > 9){
continue;
}
if ((map[trow][tcol] & 15) == 15){
continue;
}
map[trow][tcol]++;
}
}
}
for(row = 0;row <= 9;row++){
for(col = 0;col <= 9;col++){
if ((map[row][col] & 15) == 15){
printf("X");
}
else if (!(map[row][col] & 15)){
printf("0");
}
else {
printf("%d",map[row][col] & 15);
}
}
printf("\n");
}
return 0;
}
#elif 0
/*
*
*函数调用
*
*
* */
#include<stdio.h>
void func (void){
int num;
printf("%d\n",num);
num = 10;
}
void func1(void){
int num = 1000;
func();
}
int main (){
func();
func1();
return 0;
}
#elif 0
/*
*
* 返回值演示
*
* */
#include<stdio.h>
int read (void){
int num = 0;
printf("请输入一个整数:\n");
scanf("%d",&num);
return num;
}
int main (){
int num = read();
printf("num = %d\n",num);
return 0;
}
#elif 0
/*
*
*函数求和
*
* */
#include<stdio.h>
int add(void){
int num1 = 0,num2 = 0,sum = 0;
printf("请输入两个整数:\n");
scanf("%d%d",&num1,&num2);
sum = num1 + num2;
return sum;
}
int main (){
int tmp = 0;
tmp = add();
printf("tmp = %d\n",tmp);
return 0;
}
#elif 0
/*
*
*
*形式参数演示
*
* */
#include<stdio.h>
void print (int num,int num1){
printf("%d\n",num1 + num);
}
int main (){
print(3,6);
return 0;
}
#elif 1
/*
*
*鸡兔同笼
*
* */
#include<stdio.h>
int func (int heads,int legs){
int num = 0;
for (num = 0;num <= heads;num++){
if (4 * num +2 * (heads - num) == legs){
return num;
}
}
}
int main (){
int heads = 0,legs = 0,rabbit = 0;
printf("请输入头和脚的数量:\n");
scanf("%d%d",&heads,&legs);
rabbit = func(heads,legs);
printf("兔子有%d只,鸡有%d只",rabbit,heads-rabbit);
return 0;
}
#endif