赵老师笔记----数组和函数
1。数组的概念??
数组是一种构造数据类型,同种数据类型多个元素的集合。
int a[5]={1,2,3,4,5};
2。数组如何存储??
数组在计算机的内存是连续存放,逐行顺序存储。
int b[2][3]={{1,2,3},{4,5,6}};
3。数组的分类
3.1 按元素的类型分类
1)字符型
char a[10]={"abcd"};a[0]=‘a’,a[4]=‘\0’
2)数值型
short int a[10];
long int a[10];
float a[10];
double a[10];
3)结构体型
typedef struct student
{
int num
char name[50];
int english_score;
.....
} student;
struct student a[10];
student a[10];
4)指针型
char * a[10];
3.2按维数分类
一维数组
char a[10]
二维数组
char a[10][50];
三维数值
char a[10][50][100];
。。。数组
char a[10][nn][uu][xx][kk];
4。数组的定义
4.1一维数组的定义
char a[10];//a[0]表示存放的是一个字节类型的变量,占一个字节,a[1]的起始地址相对于前一个元素加一个字节
int a[10];//a[0]表示存放的是一个整数类型的变量,占四个字节,a[1]的起始地址相对于前一个元素加四个字节
在数组初始化时可以不给出数组元素的个数,而由初始化时的元素个数自动确定。
#include "stdio.h"
int main(int argc, char *argv[])
{
int a[ ]={1,2,3,4,5};//等价于int a[5]={1,2,3,4,5};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[2]));
return 0;
}
4.2二维数组的定义
定义:
数据类型 数组名 [行数][列数]
int aa [m][n];
int aa[][3]={{0,1},{2,3,4}};//aa[2][3]
由此可以扩展到多维数组的定义
int aa[k][m][n];
int aa[l][k][m][n];
二维数组定义时可以省略行数,但必须给出列数,行数由初始化的数组大小确定。
同理,三维,四维等可以缺省最高维,最高维由初始化数组的大小确定。
#include "stdio.h"
int main(int argc, char *argv[])
{
int a[][2]={{1,2},{3,4},{5,6}};//二维的行可以缺省,由初始化数组大小决定它的值
printf("%d\n",sizeof(a));//sizeof(a)该数组总大小,以字节数计
printf("%d\n",sizeof(a[2]));//a[2]表示的是第二行的首地址,sizeof(a[2])表示的该行数据占的大小
printf("%d\n",sizeof(a[2][0]);//sizeof(a[2][0])表示“5”这个元素的大小
printf("%p\n",a[1]);//a[1]表示的是第一行的首地址
printf("%p\n",a[2]);//a[2]表示的是第二行的首地址
printf("%d\n",a[2][0]);//a[2][0]表示的是第二行第0列元素的值
return 0;
}
5。数组的初始化
5.1 一维数组的初始化
a。全部初始化
int a[5]={1,2,3,4,5};
b。部分初始化
int a[5]={1,2};//部分初始化,后面不够的补0
注意:部分初始化是初始化前面部分,后面的省略,中间的不能省略
#include "stdio.h"
int main(int argc, char *argv[])
{
int a[5]={1,2,3};
char aa[5]={'1','2','A'};
printf("%d\n",sizeof(a));
int i;
for (i=0;i<5;i++)
printf("%c\n",aa[i]);
return 0;
}
c。指定初始化
char a[5]={[1]=1,[3]=3};
5.2二维数组的初始化
按行进行初始化
a。全部初始化
int b[2][3]={{1,2,3},{4,5,6}};
b。 部分初始化
int b[2][3]={{1,2},{4}};
注意:逐行部分初始化是初始化前面部分,每行后面的省略,每行中间的不能省略
逐个初始化
a全部初始化
int b[2][3]={1,2,3,4,5,6};
b部分初始化
int b[2][3]={1,2,3,4};
注意:逐个部分初始化是初始化前面部分,后面的省略,中间的不能省略,逐行存放
#include "stdio.h"
int main(int argc, char *argv[])
{
int b[2][3]={1,2,3,4};
printf("%d\n",sizeof(b));
int i,j;
for (i=0;i<2;i++)
{
for (j=0;j<3;j++)
printf("%d ",b[i][j]);
printf("\n");
}
return 0;
}
c。指定初始化
char a[5][2]={[1][0]=1,[3][1]=3};
6数组元素的引用
一维数组的引用
数组名[下标];
int a[5]={1,2,3,4,5};
对数组存储为3的元素进行访问
方法一:a[2]
方法二:a+2
二维数组的引用
int b[3][3]={{1,2,3},{4,5,6}};
数组名[行下标][列下标]
对存储为5的数组元素进行访问
方法一:b[1][1];
方法二:*(b[1]+1);//b[1]表示第一行的首地址,然后对该地址值加一,相当于将指针移动一个该数组元素所占空间大小的地址,然后取得该元素的值
方法三:*(&(b[0][0])+1*3+1));//&(b[0][0])表示取得该数组第0个元素的地址,然后移动指针到想要的元素位置,需要+(i)*m+j,然后取内容
方法四:*(b[0]+1*3+1));//b[0]就是代表第0行的首地址,实际上也是第0行第0个元素的地址
#include "stdio.h"
int main(int argc, char *argv[])
{
int b[3][3]={{1,2,3},{4,5,6}};
printf("%d\n",sizeof(b));
int i,j;
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
printf("%d ",b[i][j]);
printf("\n");
}
for (j=0;j<3;j++)
{
for (i=0;i<3;i++)
printf("%d ",b[i][j]);
printf("\n");
}
printf("%d \n",b[1][1]);
printf("%d \n",*(b[1]+1));
printf("%d \n",*(&(b[0][0])+1*3+1));
printf("%d \n",*(b[0]+1*3+1));
return 0;
}
7字符数组
定义:char a[10];
一维初始化:
char a[10]={'1','A','2','B','3','C'};
char a[]={"1A2B3C"};//利用字符串进行初始化时,字符串结束符'\0'也要占一个字节大小
多维字符数组初始化
char a[][10]={“ab”,“liming”,“张三”};
char a[][3]={'1','A','2','B','3','C'};
字符数组的引用
1一个字符占一个字节,特别注意'\0'也占一个字节
2如果没有'\0'我们进行输入或输出的时候只能单个字符访问
3加上'\0'后将非常方便我们对字符数组的访问
输出:printf("%s",a);puts(a);
输入:scanf("%s",a);//碰到空格即终止输入
gets(a);//碰到回车即终止输入,或者行结束符
#include "stdio.h"
int main(int argc, char *argv[])
{
char b[]="1A2B3C";
char a[20]={'1','A','2','B','3','C'};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(b));
int i;
for (i=0;i<6;i++)
{
printf("%c",a[i]);
}
printf("\n");
for (i=0;i<sizeof(b);i++)
{
printf("%c",b[i]);
}
printf("\n");
printf("%s\n",b);
printf("%s\n",a);
gets(a);
puts(a);
scanf("%s", a);
printf("%s\n",a);
return 0;
}
#include "stdio.h"
int main(int argc, char *argv[])
{
int b[10][4]={{1,2},{3},{4,5,6}};
printf("%p\n",b[0]);
printf("%p\n",b[0]+1);
printf("%p\n",b);
printf("%p\n",b+1);
printf("%p\n",&b);
printf("%p\n",&b+1);
return 0;
}
函数
1。函数的概念
函数是C语言的功能单位,
本质是一段代码,相对独立
应用函数的优势:
(1)程序的模块化
(2)代码的重用
(3)程序的可读性也增强
2。函数的分类
(1)函数是由谁实现
库函数(标准库函数,不同编译器单独提供的库函数)
系统调用(操作系统提供,系统编程阶段讲解)
用户自定义函数(用户)
(2)从参数角度
有参函数
int fun(int a,double b)
{
}
无参函数
int fun()
{
}
(3)有无返回值
有返回值
int fun()
{
return n;
}
无返回值
void fun()
{
}
(4)特殊函数
1)递归函数
函数本身会调用自己
void func(int n)
{
printf(“hello ,I am %d\n”,n);
if (n<0)
return ;
func(n-1);
}
2)变参函数
int printf(const char * format,.....);
printf("dlsdl");
printf("sdlajds%d",n);
printf("sd;jasdf%d jsaldf,%f",n,q);
scanf main()
变参函数的形参的类型及个数可变
3)内联函数
定义内联函数的时候就定义前加关键字inline
普通函数
int func()
{
;
}
内联函数
inline int func()
{
;
}
内联函数的效率比普通函数高
内联函数是集普通函数和宏调用优势于一身
4)回调函数:间接调用的函数
int main()
{
signal(xx,fun)
}
void fun(int sign)
{
收到了ddf;
}
3。函数的定义
即对函数的实现
3.1函数的定义方法
返回值类型 函数名字(形参列表,多形参时逗号隔开)
{
//函数体
}
int max(int x,int y)
{
int z;
if (x>y)
z=x;
else
z=y;
return z;
//return x>y ? x:y
}
函数的定义能不能实现嵌套?函数定义不能嵌套,所有函数定义时是平行关系,不能在一个函数里面定义另外的函数
int max(int x,int y)
{
int min(int x,int y)
{
return x<y ? x:y
}
return x>y ? x:y
}
应该是平行关系
int max(int x,int y)
{
return x>y ? x:y
}
int min(int x,int y)
{
return x<y ? x:y
}
4。函数的声明
4.1什么是函数的声明
对已经定义了函数进行说明
函数只能定义一次,但可以声明多次
4.2为什么要对函数进行声明??
C语言编译器总是从上往下进行编译的。
(1)在同一文件里,函数定义在后,而使用在前,编译器就不认识该函数,认为没有定义,需要声明
main()
{
int z=max(10,20);
}
int max(int x,int *y)
{
return x>y ? x:y
}
(2)需要调用另外文件里的函数,也需要声明
4.3怎么声明
直接声明法
int max(int x,int y);
间接声明
将函数的声明放在另外的头文件里
在调用函数的文件里面,包含该头文件
#include “fun.h”
5.函数的调用
变量=函数名(实参列表,多实参是逗号隔开);
有返回值的调用
int t=max(10,20);
无返回值的调用
fun(,,,);
有参数的函数调用
int t=max(10,20);
无参数的函数调用
int t=fun();
调用函数时,传参一般是通过值传递,但当形参是指针型时,传参是按地址传送