Linux编程之C语言5

2025-10-23 04:15:43

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类型的元素组成

Linux编程之C语言5

Linux编程之C语言5

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] 的二维数组中全部元素之和

               

Linux编程之C语言5

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]

使用字符指针数组方便对字符串的管理

Linux编程之C语言5

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 ]

Linux编程之C语言5

6、多级指针

存放指针变量地址的指针

int  a;

int *  p  = &a ;  一级指针变量p

int **  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 *src);

 

函数指针

指向函数的指针

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( ) ;.//  给函数指针赋值

  else

p = dec_func( ) ;

scanf(“%d %d”, &a , &b)

p(a,  b);   // 调用函数指针所对应的函数

}

 

函数指针数组

由函数指针所组成的数组

一个由10个函数指针所组成的数组, 每个函数指针指向的函数有一个整型参数并返回一个整型数

int ( *  arr[10]  )   ( int )

int  *  arr[10] ( int )

 

实验5--3

a)  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  43

9    8   6

2   34   56  中的 11

 

2: 定义一个可变M*M二维数组,算对角线上的所有元素之和

Linux编程之C语言5

9、补充图:去重字符

Linux编程之C语言5

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
相关推荐
  • 阅读量:159
  • 阅读量:190
  • 阅读量:49
  • 阅读量:83
  • 阅读量:81
  • 猜你喜欢