Day_7 结构体、链表
char - 一个字节
short - 两个字节
int - 4个字节
float - 4个字节
duoble - 8个字节
CPU通过数据总线 从内存取数据,数据总线每一次都至少通过四个字节,不会因为是char这种一个字节的数据而拿一个字节。所以结构体的大小常常不会进行人工计算,用sizeof函数进行计算。
结构体这样操作就相当于是用空间来换时间。
结构体就是值传递,不是地址传递,S1结构体不是首地址。
%s %d %f在scanf中忽略\n和空格
%s 在scanf中接受值的变量不需要取地址符号,因为%s指的是字符串数组,数组名就是首地址
typedef struct student{
int num;
char name[20];
float score;
}Student_t,*pStudent_t;//等价于 pStudent_t ====struct student*
typedef int INTERGE;
int main()
{
Student_t s={1001,"wangwu",96.5};
Student_t sArr[3]={1001,"wangwu",96.5,1005,"lilei",88.5,1007,"zhangsan",92.5};
Student_t *pp;
pStudent_t p;
int num;
p=&s;//s是单个bi'a
printf("%d %s %5.2f\n",p->num,p->name,p->score);// .的优先级高于*,->好用
p=sArr;//sArr是结构体数组的首地址
}
strcmp(“Maryt”, “Mary”)//比较两个字符串的大小,前面大则1,前面小则-1,相等则0,逐个字符进行比较ASCII大小。
Linux进程的5个段
下面我们来简单归纳一下进程对应的内存空间中所包含的5种不同的数据区都是干嘛的。
- bss段:bss段通常是指用来存放程序中未初始化的全局变量的一块区域。bss英文Block started by symbol,bss属于静态内存分配。
- 数据段:数据段通常用来存放程序中已初始化的全局变量的一块内存区域,属于静态内存分配。
- 代码段:代码段通常用来存放程序执行代码的一块区域。这部分区域的大小在程序运行前就已经确定了,通常这块内存区域属于只读,有些架构也允许可写,在代码段中也有可能包含以下只读的常数变量,例如字符串常量等。程序段为程序代码在内存中映射一个程序可以在内存中有多个副本。
- 堆(heap):堆是用来存放进程中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态分配到堆上,当利用free等函数释放内存时,被释放的内存从堆中被剔除。
- 栈(stack):栈又称堆栈,是用户存放程序临时创建的变量,也就是我们函数{}中定义的变量,但不包括static声明的变量,static意味着在数据段中存放变量。除此之外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中,由于栈的先进后出特点,所以栈特别方便用来保存、恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存,交换临时数据的内存区。
#define INTERGE int
typedef int INTERGE; //类型别名定义,知道含义见代码代码即注释
typedef struct student{
int num;
struct student *pNext;//链表节点
}Stu,*pStu
int main(){
pstu phead = NULL, ptail = NULL;//定义头尾指针,一级指针
int i;
while(scanf("%d",&i) != EOF)
{
list_head_insert(&phead,&ptail,i);
}
}
引用头文件和结构体可以合起来放在一个自己定义的头文件中,使用时使用#include "func.h"来调用。
一级指针:
函数声明不需要函数名的声明,
void listHeadInsert(pStudent_t *,Student_t **,int );
新建节点,需要malloc
pstu pnew = (pstu)malloc(sizeof(Stu));
pnew->num = i;
pnew->next = NULL;
链表为空,头节点和尾节点都指向新节点;不为空,则将原有的头节点赋值给pnew->next,pnew成为新的头节点。
pstu pnew = (pstu)calloc(1,sizeof(stu));//1指的是(结构体)个数的意思。(pstu)将calloc返回void指针强制转化
pnew->num = i;
//使用calloc就无需对pnew->next进行赋值,便捷