linux编程之C语言6
1、一:递归函数
函数自己调用自己
递归函数必须有结束条件。
func(int a )
{
if(a != 5)
func(a-1);
}
练习: 利用递归计算1到10的平方数之和
2、 二:局部变量和全局变量、形参的使用和作用域 GNU-C中的虚拟内存分布
局部变量:
在 { }内定义的变量, 作用范围是从变量定义的地方到对应的}
在不同代码块{ }可以有同名的变量,作用范围不一致
全局变量:
在 { }外定义的变量, 作用范围是从定义的地方到文件的最后,且可以被其他文件中的函数所调用
如果局部变量和全局变量,优先使用局部变量
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
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的全部成员信息
7、补充作业:
8、4: 创建一个结构体类型,里面至少有名字和年龄
定义对应结构体数组,里面有5个元素
struct info array[5];
从键盘对该数组的全部元素的成员进行输入,
for()
array[i].name &array[i].age
分别找出其中年龄最大的元素以及其中名字最小的元素并打印出来
5: 创建一个结构体类型, 定义对应结构体数组
需要对该结构数组进行增 删 查 改