1.结构体:用于承载不同数据类型的容器
结构体定义方法如下:

结构体成员运算符优先级是一级,结合方向是自左向右 " . "
还可以用省略结构体标识符的方式来定义,此时定义的结构体只能使用此前定义时的变量名,不能在下面的程序中再定义其他变量名
#include<stdio.h>
struct
{
}s1,s2;
2.结构体初始化
结构体初始化有两种方式,一种是部分初始化,一种是全部初始化,不论是哪种,中间变量名都要用逗号隔开,并且部分初始化要带结构体运算符
部分初始化:struct student s ={.score=96,.name="zhangsan"};
全部初始化:struct student s ={1,95,"lisi"};
3.结构体对齐问题
(1)结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;
(2)结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;
(3)如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;
(4)用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。
结构体对齐设计的初衷是为了提高CPU的执行效率,代价是系统会浪费一部分字节数的空间
4.结构体作为参数传递时,通常使用指针传参,因为在数据量很大的时候,值传递效率很低
5." -> "是指向结构体成员运算符,前面的部分应该为指针类型
6.结构体变量允许整体赋值操作(数组不允许整体引用)
7.输出缓冲区:当数据通过CPU运算过后也不会立即输出,而是放在输出缓冲区内,这样做是为了等待反应慢的那一方能接收数据且不影响CPU的运行效率
当缓冲区里的数据遇到以下三种情况时会直接输出:
(1)遇到\n
(2)fflush(stdout)
(3)缓冲区满时
8.用指针处理链表

链表分为有头链表和无头链表
使用有头链表可以避免指针的指针使用,降低复杂度
使用示例程序:
#include<stdio.h>
#include<stdlib.h>
struct node
{
int data;
struct node *next;
};
void push_front(struct node *phead,int n)
{
struct node *pnew = malloc(sizeof(struct node));
pnew->next = phead->next;
phead->next = pnew;
pnew->data = n;
}
/*void printlist(struct node *head)
{
struct node *p = phead->next;
while(p!=NULL)
{
printf("%d\n",p->data);
p = p->next;
}
}*/
int size(struct node *phead)
{
int counter=0;
struct node *p = phead->next;
while(p!=NULL)
{
++counter;
p = p->next;
}
return counter;
}
int main(void)
{
struct node head={0,NULL};
push_front(&head,1);
push_front(&head,2);
push_front(&head,3);
push_front(&head,4);
// printlist(&head);
printf("%d\n",size(&head));
return 0;
}

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



