Linux编程之C语言5
1、一:多维数组一维数组有相同类型的元素组成的数组 int arr[10] ; 数组arr是由10个int类型的数据组成,元素是int类型的多维数组 由数组组成的数组二维数组:最基本的类型 数组名[ 一维数组的个数 ] [ 一维数组中元素的个数 ];如: int double_arr [3][4] ;二维数组double_arr是由3个一维数组组成,每个一维数组由4个int类型的元素组成三维数组:最基本的类型 数组名[ 二维数组的个数 ][ 一维数组的个数 ] [ 一维数组中元素的个数 ];如: int tri_arr [ 3][4][5] ;三维数组tri_arr 是由3个二维数组组成,每个二维数组由4个一维数组组成,每个一维数组由5个int类型的元素组成
2、1)弛阻廖娓二维数组中的定义(1)int double_arr [3][4] ;(2)在定义时候赋初始值int double_arr [3][4] = { { 11,12,13,14},{ 22荑樊综鲶,23,24,25} ,{34,35,36,37} } ; int double_arr [3][4] = { 11,12,13,14 , 22,23,24,25 ,34,35,36,37 } ; 只要对部分元素进行赋值,其它元素值自动为0 int double_arr [3][4] = { { 11,12, },{ 22,23,24,25} ,{34,35,36,37} } ;等价于 { { 11,12 , 0 ,0 },{ 22, 23, 24, 25} ,{34, 35, 36,37} } ;int double_arr [3][4] = { 11,12,22 , 23, 24 ,25 ,34,35,36,37 } ;等价于 { { 11,12 , 22,23 },{ 24, 25,34, 35} ,{36,37,0, 0} } ;int double_arr [3][4] = {0};(3) 缺省元素个数的定义法 (二维数组的元素是一维数组, 所以缺省的是一维数组的个数)int arr [ ] = {11,2,3,45} ;int double_arr [ ] [4 ] = {11,22,33,44,55,66,77,88};等价于int double_arr [ 2 ] [4 ]= {{11,22,33,44},{55,66,77,88}}int double_arr [ ] [4 ] = {11,22,33,44,55,66,77,88,99};等价于int double_arr [ 3] [4 ]= { {11,22,33,44},{55,66,77,88},{99, 0, 0 , 0}} ;练习: 定义一个二维数组arr[3][2] ,二维数组的值由键盘输入在二维数组中找到最小值,2个for循环, 对3个一维数组中的2个元素练习:计算arr[3][2] 的二维数组中全部元素之和
3、int a[3] ;一维数组名a通常情况下表示首元素的地址 a ===== &a[0]例外 &a 表示整个一维数组的地址sizeof(a) 得到整个一维数组的大小int arr[3][4] ;二维数组的数组名 arr 通常情况下表示第一个一维数组的地址arr ====== &arr[0]是int (*)[4]类型 整个一维数组的地址&arr 表示整个二维数组的地址sizeof(arr) 得到整个二维数组的大小该二维数组由3个一维数组组成, 这3个一维数组的名字依次为arr[0] arr[1] arr[2]其中 arr[0] ======= &arr[0][0]arr[1] ======= &arr[1][0]arr[2] ======= &arr[2][0]都是int 类型的地址
4、二:指针数组由指针组成的数组数组的元素是指针(地址值+类型) 指针的类型 * 数组名[元素稍僚敉视个数];如 int * p_arr[4] ;思考1: 有二维数组int d_arr[3][4柯计瓤绘];定义一个指针数组,分别指向该二维数组中的每个一维数组的首元素int * p_arr[3] = { &d_arr[0][0] , &d_arr[1][0] , &d_arr[2][0] };也可以写成int * p_arr[3] = { d_arr[0] , d_arr[1] , d_arr[2] };练习:通过指针数组名p_arr打印出每个元素的值p_arr[0] ==== 地址 &d_arr[0][0]*(p_arr[0]) ==== d_arr[0][0]值*(p_arr[0]+1i )==== d_arr[0][1]值*(p_arr[0]+2 )==== d_arr[0][2]值*(p_arr[0]+3 )==== d_arr[0][3]值*(p_arr[1]) ==== d_arr[1][0]值*(p_arr[2]) ==== d_arr[2][0]值思考2:有3个字符串, char ch1[ ] =“hello”; char ch2[ ] =“world”; char ch3[ ] =“appletree”能不能定义一个指针数组 分别指向它们?char * p [3] = { ch1, ch2 ,ch3 } 使用的时候 直接使用数组名p或者是使用它的下标p[0]、p[1]、p[2]使用字符指针数组方便对字符串的管理
5、三:数组指针指向数组的指针int * p是指向int的指针int arr[5] ; &arr就表示整个数组的地址数组指针的定义: 类型 ( * 指针变量名)[ 元素的个数 ]int (*p) [3 ] ; 表示指向由3个int类型元素组成的数组的指针p如 : int arr[3] = {11 ,12,33};int ( *p) [3] = &arr ; // int a = 100;p === &arr 整个一维数组的地址 *p ==== arr*p ==== *(&arr) === arr === &arr[0] 首元素地址*(*p) === * arr ====*(&arr[0]) ===== arr[0] == = 11 首元素值*(*p +1) === * (arr+1) ====*(&arr[1]) ===== arr[1] == = 12 元素值for(i=0; i<3 ; i++)printf(“%d” , *(*p +i) ) ;====》 (*p) [ i ]
6、多级指针存放指针变量地址的指针int a;int * p = &a ; 一级指针变量pint ** q = &p ; 二级指针变量q 只能存一级指针变量的地址int *** x = &q ; 三级指针变量q 只能存二级指针变量的地址int *** x = NULL; 这时候是不能直接解引用,否则就段错误x ===== &q*x ===== *(&q) ===== q ===== &p**x =======*q ===== *(&p) ==== p***x ====== *p=======*(&a) ===== a定义和解引用相对应
7、指针函数返回值为依宏氽墓指针类型的函数如 char *strcpy(char *dest, const char *sr艘早祓胂c);函数指针指向函数的指针int max_func (int x, int y){return x>y? x :y;}函数指针的定义 :要强调是指针,指向的是个函数函数的返回值(*p)( 函数形参类型列表 ) ;如 int (*p) ( int , int ) = max_func( );定义了一个函数指针p, 指向的是max_func这个函数int (*p) ( int , int );定义了一个函数指针变量p, 指向的函数是返回值为int , 形参由两个int类型的数据组成 p = max_func( ) ; // 也可以 p = &max_func( ) ; &此时可以省去通常函数指针是用在回调函数中的可以通过函数指针来进行函数的调用如 int val = p (100, 200);函数指针的使用:int add_func( int a, int b) ;int dec_func( int a, int b) ;main( ){ int (*p) ( int , int ); // 定义了一个函数指针 scanf(“%d”, &mode); if(mode == 1)p = add_func( ) ;.// 给函数指针赋值 elsep = dec_func( ) ;scanf(“%d %d”, &a , &b)p(a, b); // 调用函数指针所对应的函数}函数指针数组由函数指针所组成的数组一个由10个函数指针所组成的数组, 每个函数指针指向的函数有一个整型参数并返回一个整型数int ( * arr[10] ) ( int )int * arr[10] ( int )实验5--3a) int a ;b) int * a ;c) 二级指针 int ** a;d) int a[10];e) 指针数组 int * a[10]f) 数组指针(强调) int (* a) [10]g) 函数指针 (强调) int (*a)(int)h) 函数指针数组 int ( * arr[10] ) ( int )
8、作业:分别用数组下标、数组指针、指针数组 完成以下练习 1: 定义一个二维数组,并判断其中是否有马鞍数 ,如果有则把对应的下标和值都打印出来马鞍数:在一行中最小, 但是在一列中最大11 22 439 8 62 34 56 中的 112: 定义一个可变M*M二维数组,算对角线上的所有元素之和
9、补充图:去重字符