-
malloc分配内存块的函数,sizeof判断数据类型长度符
当不存在时给head一个空值NULL
判定while(),调用
查看全部 -
1.静态数据结构:整形,浮点型,数组(很难确定占用多大的空间)
2.动态数据·结构:(1)head里存在地址,
(2)链表里边各个·元素的地址不一定是连续的
3.用结构体类型作节点元素:指针,赋值,循环
4.节点到下一个节点没有(例子:c.next=NULL)用空表示
查看全部 -
共用体:
1、不同数据类型的变量共享一个内存地址
2、该结构体所占实际内存为最大的成员所占
3、关键字union
union data{
..
..
}
union data data_1
查看全部 -
共用体:
为不同变量提供同一块内存地址
声明方法:
union [name]{
...
};
使用:union [union_name] [value_name];
共用体声明时只能有一个常量。给共用体成员赋值时后赋值的变量值会覆盖前一个。
共用体所占的内存地址是其成员中内存地址最大的成员的内存地址。
结构体对象大小=最后一个成员的大小+最后一个成员的偏移量+填充字节数
偏移量:结构体中一个成员相对于共用体的首字节(即第一个成员的首字节)所距离的大小。(那么第一个成员相对于结构体的偏移量为0)
每个成员所占内存大小的偏移量=成员字节大小的整数倍。(若不是,则编译器会在前一个成员后做字节填充,使这个成员的偏移量=字节大小的整数倍。计算结构体内存地址大小时若最后一个成员的偏移量仍不等于这个成员字节大小的整数倍,会在最后一个成员后做字节填充。)
打印某个变量的字节大小:
printf("%lu",sizeof(...));
共用体与结构体其他基本相同
查看全部 -
4-1 Linux C 公用体
abc 存放到一个公用体中,节省开销 ,同一时刻只能存储一个成员
union data{ int a;int b;int c;};
结构体空间大小涉及到字节对齐,对齐的目的是让计算机快速读写
结构体对象大小=最后一个成员的大小+最后一个成员的偏移量+填充字节数
每个成员所占内存大小的偏移量=成员字节大小的整数倍。
a的偏移量是0,b的偏移量是4,c的偏移量是8
结构体总大小是12,是最宽的基本类型成员大小(int ,4)的整数倍
公用体变量和各个成员的变量是一个地址
查看全部 -
静态数据结构:系统自动分配存储空间——整型、浮点型、数组。。。
动态数据结构:链表
链表包括头文件和元素,头文件包括地址,元素包括每一个节点,每一个节点包括用户需要的数据和下一个节点的地址(元素地址不定是线性的)
malloc函数用于分配动态空间,在头文件<malloc.h>之下。
查看全部 -
3种调用成员变量的方法:
结构体变量名称.成员变量名
(*p).成员变量名
p->成员变量名
指针p=weapons;
struct weapon weapons[2]={{"name1",100,200},{"name2",100,200}};
printf("%s\n",p->name);//此时输出为weapons[0].name,即name1
p++;//指向了weapons[1]
查看全部 -
.c文件->预处理->.i文件->编译->.s文件->汇编->.o文件->链接->可执行文件
vim helloworld.c创建一个.c文件
gcc helloworld.c编译文件
gcc -o helloworld.i helloworld.c -E生成一个.i文件,只进行预处理
预处理:展开头文件,宏替换
查看全部 -
malloc返回的是开辟空间的首地址,他并不知道你放的是什么类型的东西,所以要用第一个括号中的内容强制转换指针类型为struct weapon*,和p1的类型转为一样,否则会警告指针类型不符合
#include <stdio.h>
struct nam
{
char *name[20]; //用指针
int old;
float height;
struct nam * next;
};
int main()
{
struct nam a,b, *head;
a.name[0]="李"; //第一个地址
a.old=16;
a.height=70.2;
b.name[0]="林";
b.old=21;
b.height=65.3;
head=&a;
a.next=&b;
b.next=NULL;
struct nam *w;
w=head;
while (w!=NULL){
printf("姓名:%s\n年龄:%d\n身高:%f\n",w->name[0],w->old,w->height); //把地址取出来
w=w->next;
}
return 0;
}
查看全部 -
简化后代码,并且分析了各作用 ,分层明确,容易懂和识别
#include <stdio.h>
#include <malloc.h>
struct weapon { //这层函数作用设立变量名和这节函数指针
int price;
int atk;
struct weapon * next;
};
struct weapon * create(){
struct weapon * head; struct weapon * p1,*p2; //创建头指针和节点指针
head,p2->next =NULL;//头指针和节点指针,都需要放数据所以需要注空
p1=(struct weapon *)malloc(sizeof(struct weapon));//建立第一节点空间,并可以输入
scanf("%d,%d",&p1->price,&p1->atk);
int n=0;//循环并设立指向头指针和p2指针方向
while(p1,p2->price!=0){
n++;
if(n==1) head=p1;
else p2->next=p1;
p2=p1;
p2=(struct weapon*)malloc(sizeof(struct weapon));// 建立第二节点空间
scanf("%d,%d",&p2->price,&p2->atk);
}
return (head);
}
int main(){//建立前2个函数指针并指引然后运行函数输出
struct weapon * p;
p=create();
printf("%d,%d",p->atk,p->price);
return 0;
}
查看全部 -
typedef 是一个关键字,不参与预处理,给变量类型起别名
格式:typedef 类型 别名;
例子:typedef int *p;
p q = NULL; 相当于 int *q = NULL;
宏的作用域是整个程序文件,即使写在某个函数里面,还是可以全局调用
typedef是有作用域的,在全局中写作用全局,在函数内写,作用在函数内
查看全部 -
typedef(是个关键字)并不在预编译里,作用是给变量类型其别名,需要以‘;’结尾。 容易与宏定义混淆。 宏作用域起始于定义位置,结束于文件结尾,而typedef是根据所在代码位置决定作用域的。查看全部
-
.c预处理后是.i,.i编译后是.s,.s汇编后是.o查看全部
-
创建动态链表链表查看全部
-
1、union公用体的所有成员共用一块内存 2、结构体对象的大小 = 最后一个成员的偏移量 + 最后一个成员的大小 + 末尾的填充字节数; 偏移量 :某个成员的实际地址与结构体首地址之间的距离 结构体字节对齐准则:每个成员相对于结构体首地址的偏移量,都得是当前成员所占内存大小的整数倍,如果不是就会在成员之间加上填充字节查看全部
举报