目录
1.动态内存分配1
2.结构2
3.结构指针2
4.递归函数3
5.宏定义3
6.文件包含4
7.条件编译5
8.外部变量,多文件6
9.函数指针7
10.typedef的用法8
11.链表8
12.图形程序设计8
13.算法分析10
动态内存分配
动态内存分配函数malloc()
函数原型:void* malloc(unsigned size)
申请成功,返回指向所分配内存空间的起始地址的指针;申请失败,返回NULL。
注意:void* 类型要强制转化成 相应的类型如(int*)
例如: if ((p = (int*) malloc (n*sizeof(int)) == NULL){}
计数动态存储分配函数calloc()
函数原型:void* calloc(unsigned n, unsigned size)
函数功能:在内存的动态存储区中分配n个连续空间,每个存储空间的长度为size,并且分配后还把存储块里全部初始化为0
申请成功,返回指向所分配内存空间的起始地址的指针;申请失败,返回NULL。
例如:if ((p = (int*) calloc (n, sizeof(int))) == NULL){}
动态存储释放函数free()
注意分配了就要释放,释放后就不能再访问。
只能还申请来的空间的首地址
分配调整函数realloc()
函数原型: void* realloc ( void* ptr, unsigned size)
函数功能:更改以前已经分配到内存空间的指针如指针p的内存分配。将开辟的空间大小变为了size,新开辟的空间与以前size大小的数据一样。
注意分配成功不能再用ptr了,要用新的指针。
(5) char *str = “Hello”;正确,将str指向一个常量字符串,但是无法修改。
char str[] = “Hello” char str[10] = “Hello”正确,相当于将字符串常量存储在str分配的空间中,可以修改。
char *str : 变量指针; str =“Hello”,将地址赋给变量指针,正确
char *str[10]; 常量指针 str =“Hello”,不可以,必须strcpy(),而
char *str[] = “HELLO”可以的原因是,这是初始化,不是赋值。
char *str; 不可以直接用指针来scanf,如scanf(“%d”,str);因为,str没有存储空间,必须给str分配一段内存空间才可以。
输出的话printf(“%s”,str);只要一个指针即可,会到’\0’为止
结构
struct student{
int num;
char name[20];
};
定义结构变量: struct student s1, s2; //struct student 表示一个新类型
结构变量初始化: struct student s1 = {100, “xx”};//初始化表
struct student s1 ={.name = “xx“};
结构变量之间可以赋值: s1 = s2; //类型相同
s1 = (struct student){100,“xx”}; //这样也行
结构变量访问成员: s1.num 嵌套结构:class1.student[1].num
结构变量作为函数参数:
与数组不同注意结构变量的名字并不是结构变量的地址。
结构的嵌套定义, 嵌套定义时,必须先定义成员的结构类型,在定义柱结构类型.
结构数组:struct class{
struct student students[50]; //定义结构数组
};
注意:结构数组之间所有元素都属于相同的结构类型,因此数组之间可以相互赋值。如 students[1] = students[2];
结构指针
比如:
struct student *p; //p是指向结构的指针
p = (struct student*) malloc (sizeof(struct student));
结构指针的值实际上是结构变量的首地址,即第一个成员的地址。
与数组不同注意结构变量的名字并不是结构变量的地址。
使用结构指针的方法:
p = &s1; //让p指向结构变量s1 注意取地址符,结构数组就不要了
或者给p开辟一段新的内存空间来读入数据:
p = (struct student*) malloc (sizeof(struct student));
用指针变量访问结构成员的方法:
(*p).num; 相当于 s1.num; 注意要加括号,否则会成为*(p.num)
p->num; //一般都用这样来访