递归(二)
对于二叉树来说,递归相较于迭代更好实现。在斐波那锲(fibnacci)数列中进行较多的应用。
int gettimeofday(struct timeval *tv,const struct timezone *tz);用来计算程序的运行时间,包含在sys/time.h头文件中。
迭代所用的时间明显比递归所用的时间要短;
走迷宫递归输出全部路线(4层递归)
罗汉塔递归输出全部路线(2层递归)
结构体(联合,共用体)
联合,共用体是基于内存较少的情况下所使用的;
结构体在c中默认是公有的,包含在string.h头文件中
结构体的声明(在函数体外):
struct 【结构体数据类型名】 {
int age;
char name[20];
float high;
char phone[20];
struct person* a;
}; //结构体声明
在函数体内定义结构体:
struct 【结构体数据类型名】 【结构体变量名】;
eg:struct person jim;
jim.age=30;
strcpy(jim.name,"jim");//调用strcpy函数给数组变量赋值
jim.high=1.73;
printf("age:%d\n",jim.age);
字节对齐与地址对齐访问
#字节对齐
#pragma pack(1) //最大对齐字节数为32位4字节,64位8字节,按多少字节的整数倍对程序进行字节对齐,如果没有定义按最大字节数的整数倍对齐
如何计算结构体的大小
当前结构体的大小是下一个类型的整数倍,否则用字节补齐;
总大小是最宽字节的整数倍;64位是8位,32位是4位;否则用字节补齐
数组在结构体中单一拆分进行对齐,longlong型和double型在32位的计算是8字节,对齐是以2个4字节;64位的计算和对齐都是8字节
补齐的字节中没有数据。
#地址对齐访问
如果地址能被8整除的是double型或longlong型,
如果地址能被4整除的是int型,若int型地址不能被4整除则是地址非对齐访问,会造成程序崩溃
如果地址不能被4整除但能被2整除的是short型,若不是同上
如果地址是个奇数的是char型。若不是同上
结构体指针的声明与定义
struct 【结构体数据类型名】* 【结构体指针变量名】;
eg:struct person* pa=NULL;
pa=(struct person*)malloc(sizeof(struct person));
pa->age =100;
printf("pa->age:%d\n",tmp->age);
free(pa);
C++中的结构体
@@@
class preson{
private:
int age;
char* name;
public:
int eat(char* name)
{
printf("%s\n",name);
}
int run();
};
int main()
{
jim.eat("jitui");
return 0;
}
@@@
在结构体中用函数指针调用函数
struct person{
int age;
char* name;
int (*peat)(char*);
}
void eat(char* name)
{
printf("%s\n",name);
}
int main()
{
struct person jim;
jim.tmp=eat;
jim.peat("paomo");
return 0;
}
struct preson jim = {
.age=100,
.name="jim",
}; \\结构体内的数组类型不可直接赋值
联合
union person{
int age;
char name;
};
int main()
{
union person a;
a.age = 100;
a.name = 'x';
}
所占空间大小为联合体中占用空间最大的类型的大小。联合只有一块空间,重复输值回覆盖当前的值。
结构体类型名的重定义
typedef struct person{
int age;
char* name;
}PRE,*PPRE;
int main()
{
PPRE a;
a->name ="jim";
a->age = 100;
PRE b;
b.name = "kaka";
b.age = 21;
return 0;
}
如何计算程序运行的详细时间效率
#include<sys/time.h>
struct timeval start,end;
gettimeofday(&start,NULL);
gettimeofday(&end,NULL); //传空按内核时区进行计算
printf("time:%lu us \n",(end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
如何在mian函数之前执行一个函数(主要利用在用户登陆的情况)
__attribute((constructor))int before_main()
{
printf("hello main!\n");
}
int main()
{
printf("main\n");
return 0;
}
作业:
迷宫
在字符串中找出第一个只一次的字符;eg:abaccdeff put:a 时间复杂度为O(n)
对于二叉树来说,递归相较于迭代更好实现。在斐波那锲(fibnacci)数列中进行较多的应用。
int gettimeofday(struct timeval *tv,const struct timezone *tz);用来计算程序的运行时间,包含在sys/time.h头文件中。
迭代所用的时间明显比递归所用的时间要短;
走迷宫递归输出全部路线(4层递归)
罗汉塔递归输出全部路线(2层递归)
结构体(联合,共用体)
联合,共用体是基于内存较少的情况下所使用的;
结构体在c中默认是公有的,包含在string.h头文件中
结构体的声明(在函数体外):
struct 【结构体数据类型名】 {
int age;
char name[20];
float high;
char phone[20];
struct person* a;
}; //结构体声明
在函数体内定义结构体:
struct 【结构体数据类型名】 【结构体变量名】;
eg:struct person jim;
jim.age=30;
strcpy(jim.name,"jim");//调用strcpy函数给数组变量赋值
jim.high=1.73;
printf("age:%d\n",jim.age);
字节对齐与地址对齐访问
#字节对齐
#pragma pack(1) //最大对齐字节数为32位4字节,64位8字节,按多少字节的整数倍对程序进行字节对齐,如果没有定义按最大字节数的整数倍对齐
如何计算结构体的大小
当前结构体的大小是下一个类型的整数倍,否则用字节补齐;
总大小是最宽字节的整数倍;64位是8位,32位是4位;否则用字节补齐
数组在结构体中单一拆分进行对齐,longlong型和double型在32位的计算是8字节,对齐是以2个4字节;64位的计算和对齐都是8字节
补齐的字节中没有数据。
#地址对齐访问
如果地址能被8整除的是double型或longlong型,
如果地址能被4整除的是int型,若int型地址不能被4整除则是地址非对齐访问,会造成程序崩溃
如果地址不能被4整除但能被2整除的是short型,若不是同上
如果地址是个奇数的是char型。若不是同上
结构体指针的声明与定义
struct 【结构体数据类型名】* 【结构体指针变量名】;
eg:struct person* pa=NULL;
pa=(struct person*)malloc(sizeof(struct person));
pa->age =100;
printf("pa->age:%d\n",tmp->age);
free(pa);
C++中的结构体
@@@
class preson{
private:
int age;
char* name;
public:
int eat(char* name)
{
printf("%s\n",name);
}
int run();
};
int main()
{
jim.eat("jitui");
return 0;
}
@@@
在结构体中用函数指针调用函数
struct person{
int age;
char* name;
int (*peat)(char*);
}
void eat(char* name)
{
printf("%s\n",name);
}
int main()
{
struct person jim;
jim.tmp=eat;
jim.peat("paomo");
return 0;
}
struct preson jim = {
.age=100,
.name="jim",
}; \\结构体内的数组类型不可直接赋值
联合
union person{
int age;
char name;
};
int main()
{
union person a;
a.age = 100;
a.name = 'x';
}
所占空间大小为联合体中占用空间最大的类型的大小。联合只有一块空间,重复输值回覆盖当前的值。
结构体类型名的重定义
typedef struct person{
int age;
char* name;
}PRE,*PPRE;
int main()
{
PPRE a;
a->name ="jim";
a->age = 100;
PRE b;
b.name = "kaka";
b.age = 21;
return 0;
}
如何计算程序运行的详细时间效率
#include<sys/time.h>
struct timeval start,end;
gettimeofday(&start,NULL);
gettimeofday(&end,NULL); //传空按内核时区进行计算
printf("time:%lu us \n",(end.tv_sec - start.tv_sec)*1000000 + (end.tv_usec - start.tv_usec));
如何在mian函数之前执行一个函数(主要利用在用户登陆的情况)
__attribute((constructor))int before_main()
{
printf("hello main!\n");
}
int main()
{
printf("main\n");
return 0;
}
作业:
迷宫
在字符串中找出第一个只一次的字符;eg:abaccdeff put:a 时间复杂度为O(n)