linux编程之C语言6

2025-10-23 02:24:58

1、一:递归函数

     函数自己调用自己

 递归函数必须有结束条件。

func(int   a )

{

  if(a != 5)

func(a-1);

}

练习: 利用递归计算1到10的平方数之和

linux编程之C语言6

2、 二:局部变量和全局变量、形参的使用和作用域  GNU-C中的虚拟内存分布

     局部变量:

在 {   }内定义的变量, 作用范围是从变量定义的地方到对应的}

在不同代码块{ }可以有同名的变量,作用范围不一致

全局变量:

在 {   }外定义的变量, 作用范围是从定义的地方到文件的最后,且可以被其他文件中的函数所调用

如果局部变量和全局变量,优先使用局部变量

linux编程之C语言6

3、形参:

   是在定义函数的时候在( )中定义, 作用范围是整个函数

var.c:5:8: error: ‘x’ redeclared as different kind of symbol  

函数最大{  }中的局部变量名不能和形参名一致

 

      int  func( int  x)

{

printf(“x = %d \n”, x);

int y ;// 是从此时开始才可以使用局部变量y

printf(“y = %d \n”, y);

}

4、extern  叫外部调用声明  对应的函数或者是全局变量可能不是本文件中定义的

static   静态 

static int a ;   静态变量a是在内存的数据段中的

        静态变量只会被定义和初始化一次,

此后使用的都是已申请空间的最新值

如果static 是在代码块、函数中定义, 则为静态局部变量

   如果是在所有函数之外定义的 ,则为静态全局变量

const

在本次运算过程中的“常量” ,值不会被修改

char *strcat(char *dest, const char *src);   把src中的字符全部复制到dest的后面

           “hello ”     “world”    ==> helloworld  --> dest 

linux编程之C语言6

5、 

练习:   编写一个函数 add_func, 要求在程序中记录自己被调用的次数

         在主函数中,循环根据输入的符号来实习数据的运算

如输入了2个整数后, 此时

输入字符‘+’   就调用add_func(  ) 直接计算并显示出结果

同时在main记录函数add_func的返回值, 确定调用的次数

输入字符‘-’   就调用dec_func(  ) 直接计算并显示出结果

6、复合数据类型:

结构体

用来描述一个事物不同方向的属性,

1)结构体类型的定义:

1) struct  结构体类型名

{

成员1的类型   成员1的名字;

成员2的类型   成员2的名字;

成员3的类型   成员3的名字;

.。。。。。。

};

2) typedef   (  )

如要定义一个结构体类型struct  info,包含有3方面信息, 姓名、班级、年龄

struct  info

{

char name[16] ;

int  class;

unsigned  char  age ;// 【0~255】

};

2) 占用空间的计算

int   char ---- 占用字节数不一致   sizeof(int)

     新类型 struct info 到底占用了多少字节   sizeof(struct  info)

struct  info

{

char name[16] ;   // char [16]  --> 16

int class;       //    ---> 4

unsigned  char  age ;//   【0~255】   ---> 1+3

};

struct info1

  {

         char name[16]; // 16

          short class; // 2

          unsigned char age; // 1+1

  };

在计算结构体实际占用空间大小时候,

1) 要先找到占用字节数最多的基本数据类型(max_b),在成员地址对齐的时候, 会以max_b作为参考

如占用字节数最多的是short类型   最终结果以2对齐, “每个房间都能放2B”

如占用字节数最多的是int类型   最终结果以4对齐, “每个房间都能放4B”

如占用字节数最多的是long , 64位机最终结果以8对齐, “每个房间都能放8B”; 32位机以4对齐, “每个房间都能放4B”

如占用字节数最多的是double类型  最终结果以8对齐, “每个房间都能放8B”

如占用字节数最多的是指针类型,, 64位机最终结果以8对齐, “每个房间都能放8B”; 32位机以4对齐, “每个房间都能放4B”

2) 在中间成员对齐时候,

short以2对齐, char 以1 ,

long、double 以8对齐

float / int 是以4对齐

3) 定义一个结构体类型的变量

   struct  info

{

char name[16] ;   // char [16]  --> 16

int class;       //    ---> 4

unsigned  char  age ;//   【0~255】   ---> 1+3

};

      a)不带初值的定义

 结构体类型名  变量名 ; 

struct  info   zhangsan ;  // 定义一个结构体类型为struct info的变量zhangsan

       b) 带初值的定义 只有在定义的时候可以直接给结构变量的成员一次性赋值

结构体类型名  变量名  = { 依次给对应的成员赋值     };

结构体变量中的成员用 . 来表示

struct  info   student=  { “zhangsan” , 1812 ,  20 }; // 扩展性不好

建议在定义的时候逐个给指定成员赋值

struct  info   student=  { .name=“zhangsan”,  .class = 1812 ,  .age=20 };

struct  info   student=  { .name=“zhangsan” ,  .age=20 };

 

4)  使用变量

struct  info

{

char name[16] ;   // char [16]  --> 16

int class;       //    ---> 4

unsigned  char  age ;//   【0~255】   ---> 1+3

};

         a) 直接使用结构体变量名

student = { “lisi” , 1812, 21 }; // NG !!  只有定义时候可以一次性赋值

struct info stu1 = {“zhangsan ” ,  1812 , 21};

struct info stu2 = { “lisi ” ,   1810 ,  22};

struct info  max ;

找出这两个变量中年龄比较大的,把他的整个信息赋值给结构体变量max

 max = stu2;  //直接整个变量值都赋值给另一个变量 ok

b) 使用结构体变量中的成员

struct info stu1;

struct info stu2;

struct info  max ;

scanf ( “%s” , stu1.name) ;//   &(stu1.name[0])

scanf ( “%d” , &stu1.class) ;

scanf ( “%hhd” , &stu1.age) ;

scanf ( “%s” , stu2.name) ;//   &(stu1.name[0])

scanf ( “%d” , &stu2.class) ;

scanf ( “%hhd” , &stu2.age) ;

if ( stu1.age > stu2.age)

max = stu1;

else

max = stu2;

练习:先定义一个结构体类型 struct info

      再定义同类型的2个变量  , 利用键盘给这两个结构体变量中的所有成员赋值,比较其中的一个成员(如 .age),把较大的变量直接赋值给结构体类型变量max

输出max的全部成员信息

linux编程之C语言6

linux编程之C语言6

7、补充作业:

linux编程之C语言6

8、4: 创建一个结构体类型,里面至少有名字和年龄

定义对应结构体数组,里面有5个元素

struct info  array[5];

从键盘对该数组的全部元素的成员进行输入,

    for()

array[i].name    &array[i].age

分别找出其中年龄最大的元素以及其中名字最小的元素并打印出来

5:    创建一个结构体类型, 定义对应结构体数组

  需要对该结构数组进行增 删 查 改

linux编程之C语言6

linux编程之C语言6

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