-
武器信息的單向動態鏈表,在程序執行的過程中逐漸創建節點
struct weapon * create()//返回值是鏈表的頭指針
{struct weapon * head;//頭指針
struct weapon * p1,*p2;//鏈表當前新創建的節點,上一個節點
int n=0;//記錄當前鏈表個數
p1=p2=(struct weapon *)malloc(sizeof(struct weapon));//#include<malloc.h>,malloc分配內存塊,sizeof判斷數據類型的長度符
head=null;//賦初值
scanf("%d,%d",&p1->price,&p1->atk);
while(p1->price!=0)
{
n++;
if(n==1)head=p1;
else p2->next = p1;//上一個節點的next指向創建的新節點
p2=p1;//創建完成之后更新舊節點
p1=(struct weapon *)malloc(sizeof(struct weapon));//更新p1
scanf("%d,%d",&p1->price,&p1->atk);
}
p2->next=null;
return (head);
}
struct weapon * p;
p=creat();//p是頭指針,指向第一個節點
查看全部 -
靜態數據結構(固定大?。赫?,浮點型,數組,
動態數據結構:鏈表
每一個節點包含兩個部分,一部分是用戶需要的數據,一部分是下一個節點的地址
鏈表里各個元素的地址不連續
struct weapon{
int price;
int atk;
struct weapon *next;//下一個節點的信息
};
struct weapon a,b,c,*head;
a.price=100;
a.atk=100;
b.price=200;
b.atk=200;
c.price=300;
c.atk=300;
head=&a;
a.next=&b;
b.next=&c;
c.next=null;
struct weapon *p;
p=head;
while(p!=null){
p->atk,p->price;
p=p->next;
}
a.price=100;
a.atk=100;
查看全部 -
共用體 聯合體 幾個不同的類型變量使用同一個內存地址,節省一定的開銷,同一時刻只能存儲一個成員
union data{
int a;
char b;
int c;
}
union data data_1;
data_1.b='c';
data_1.a=10;//起作用
union data data_2={10};
共用體所占的內存長度是它所有成員里所占內存最長的成員長度
int為4,char為1,union長度為4
結構體(字節對齊,快速讀寫,空間換取時間)所占內存長度是最后一個成員的偏移量加上最后一個成員的大小加上末尾的填充字節數
偏移量是某一個成員的實際地址和結構體首地址之間的距離
a偏移量為0,b偏移量為a的大小4
每個成員相對于結構體首地址的偏移量是當前成員所占內存大小的整數倍,如果不是則填充字節
c偏移量為a的大小4+b的大小1等于5不能整除c的大小4,所以在b后填充字節使c的偏移量為8
結構體大小為8+4=12
結構體總大小是不是結構體中內存長度最長的成員長度的整數倍,如果不是填充字節
12可以整除4,如果不能整除則在c后填充字節
%lu? ?sizeof(struct data)
共用體變量的地址和成員的地址是同一個
%p? &data_1.a
查看全部 -
結構體指針
struct weapon *w;
w=&weapon_1;
(*w).name表示指向結構體中的成員()不能省略,.的優先級大于*的優先級,w->name
*w表示指向結構體變量
結構體數組指針
struct weapon *p;
p=weapon_2;
p->name既是weapon_2[0].name
p++既是weapon_2+1,指向了weapon_2[1]
查看全部 -
初始化結構體
struct weapon weapon_1={"weapon_name",100,200};
訪問結構體成員,具有所有變量的操作
weapon_1.name
++weapon_1.price
結構體數組
int a[2]={1,2}
struct weapon weapon_2[2]={"weapon_name1",50,100,"weapon_name2",100,200}
struct weapon weapon_2[2]={{"weapon_name1",50,100},{"weapon_name2",100,200}}
weapon_2[0].name
weapon_2[1].price
查看全部 -
struct 是不同變量類型的集合
數組是相同變量類型的集合
struct weapon{
char name[20];
int atk;
int price;
};
struct weapon weapon_1;struct weapon{
char name[20];
int atk;
int price;
}weapon_1;//全局變量
struct {
char name[20];
int atk;
int price;
}weapon_1;//全局變量
查看全部 -
預處理命令
查看全部 -
動態鏈接查看全部
-
define的作用域是宏定義下面的所有代碼
typedef:關鍵字,給變量類型起別名,預處理之后不會被替換,有作用域
typedef int a;(以分號為結尾)
typedef int *p;(給int* 起別名叫p)
p q=NULL;//int *q=NULL;
結構體:
typedef unsigned long size_t
struct stu{};
stuct stu XXX;
typedef struct stu{}stu_t;
stu_t XXX;
查看全部 -
#define N(n) n*10
int b=N(a);? ?//int b=a*10;
#define ADD(a,b) a+b
int b=ADD(a,b);? ?//int b=a+b;
int e=ADD(a,b)*ADD(a,b)//預處理int e=a+b*a+b->執行
#define ADD(a,b) (a+b)不要求類型
查看全部 -
#define R 10(不要分號)
10作為一個字符串替換掉R
#define M int main(也可以執行,預處理不考慮語法
反復使用的常量,數組buffer(數組大?。?,便與修改
查看全部 -
.c文件->預處理->.i文件->編譯->.s文件->匯編->.o文件->鏈接->可執行文件
vim helloworld.c創建一個.c文件
gcc helloworld.c編譯文件
gcc -o helloworld.i helloworld.c -E生成一個.i文件,只進行預處理
預處理:展開頭文件,宏替換
查看全部 -
共用體:共用體內的各元素分時占同一個地址上。
查看全部 -
共用體內的數據存儲的地址都是同一地址,每一時刻只能存儲一個數據。共用體的存儲地址長度是內部定義的最長數據類型的長度。而結構體的存儲地址長度是內部各數據的長度的累加(注意:每個數據的偏移量必須是自身長度的整數倍,如果不是整數倍,則填充。如int,char,int,則最后的int的偏移量是int+char=5,則int前需要填充3個字節到8個字節,才為int的整數倍。如果總長度不是內部長度最大的整數倍,則最后一個的長度要填充)
查看全部 -
typedef有作用域的問題
define沒有作用域的問題
在預編譯階段 #define段會把內容替換 但typedef并不會
.i文件是進行預編譯之后生成的文件,一般都是把頭文件包含進去,進行宏替換這些工作之后生成的文件。
查看全部
舉報