strcat(s,s);会发生内存重叠,处理方法先将.src拷贝到buffer中,在进行连接。
一、指针数组和指向指针的指针
1.1定义
一维指针数组定义: 类型名 * 数组名 [数组长度]:
指向指针的指针:类型名 **p;
1.2指针数组作main函数的参数

命令行的一般形式为
此外,指针的指针还可作为函数的返回值和各种函数的参数,在使用时要注意变量中存放的到底是变量的地址还是指针地址的地址,判断清楚后再搭配*使用。
二、结构体和共用体
. 结构体成员运算符 ->指向结构体成员运算符
2.1声明、定义和初始化
2.1.1结构体和各成员的声明
一个结构体类型的一般形式为:
struct 结构体名
{ 成员表列 }; 成员表列中对各成员进行类型声明:类型名 成员名;
2.1.2结构体类型变量的定义
在定义结构体类型变量时,有三种方法:1)先声明结构体类型再定义变量名;
eg:struct student s1,s2;
2)在声明类型的同时定义变量


3)直接定义结构体类型变量(不写结构体名)

这样定义的好处是防止其被修改,缺点是后续不能继续添加变量。
2.1.3结构体变量初始化:



关于结构体类型,有几点要说明:
(1)类型与变量是不同的概念,不要混同。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。在编译时,对类型是不分配空间的,只对变量分配空间。
(2)对结构体中的成员(即“域”),可以单独使用,它的作用与地位相当于普通变量。
(3)成员也可以是一个结构体变量。
2.2结构体变量的引用
两种办法1)使用结构体成员运算符 .
一般形式:结构体变量名 . 成员名 eg:student1 . num = 100;student1.birthday.month;
2)通过地址引用
struct Student *a;a = &student1;a->name 或者(*a) . name。
2.3内存对齐
所有的数据被存放的首地址一定能被4整除。
1)到结构体成员中去查找最长的元素,最终按该元素长度对齐(结构体的最终大小能够整除这个数);
2)每个结构体成员所处的位置(偏移量)必须能够整除该成员的字节数。
3)最多按cpu位数(32位为4字节)
eg;student1中依次定义了char c;int t; short n;其占12个字节。
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| c | t | t | t | t | n | n |
若顺序是char c;short n;int t;其占8个字节。
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| c | n | n | t | t | t | t |
这样做会牺牲空间,但会节约时间,让程序更高效。
2.4用结构体变量和指向结构体的指针作函数参数
用结构体变量作实参,用的时值传递的方式,若结构体中定义了很多成员,规模较大,在此基础上用结构体变量作实参会占用很多内存空间,因此很少使用该方法,常用指向结构体的指针代替,这样仅仅复制了它的地址,仅占八个字节,大大节约了空间的占用。
这里仅以打印函数举例。
void printStudent(struct Student *p)
{
printf("%d %s %f\n",p->id,p->name,p->score);
}

被折叠的 条评论
为什么被折叠?



