国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

四大C語(yǔ)言知識(shí)總結(jié)

共 31665字,需瀏覽 64分鐘

 ·

2022-06-13 14:41

不點(diǎn)藍(lán)字關(guān)注,我們哪來(lái)故事?

1、#define宏定義

以#號(hào)開(kāi)頭的都是編譯預(yù)處理指令,它們不是C語(yǔ)言的成分,但是C程序離不開(kāi)它們,#define用來(lái)定義一個(gè)宏,程序在預(yù)處理階段將用define定義的來(lái)內(nèi)容進(jìn)行了替換。因此在程序運(yùn)行時(shí),常量表中并沒(méi)有用define定義的常量,系統(tǒng)不為它分配內(nèi)存。define定義的常量,預(yù)處理時(shí)只是直接進(jìn)行了替換,,它用來(lái)將一個(gè)標(biāo)識(shí)符定義為一個(gè)字符串,該標(biāo)識(shí)符被稱(chēng)為宏名,被定義的字符串稱(chēng)為替換文本。,因此在編譯時(shí)它不對(duì)宏的定義進(jìn)行檢查,作用域不影響對(duì)常量的訪問(wèn) 。它的常量值只能是字符串或數(shù)字。     該命令有兩種格式:一種是簡(jiǎn)單的常量宏定義, 另一種是帶參數(shù)的宏定義。

不帶參數(shù)的宏:#define< 名字 >< 值 >    要注意,沒(méi)有結(jié)尾的分號(hào),因?yàn)椴皇荂的語(yǔ)句,名字必須是一個(gè)單詞,值可以是各種東西,宏定義是用宏名來(lái)表示一個(gè)字符串,在宏展開(kāi)時(shí)又以該字符串取代宏名,這只是一種簡(jiǎn)單的代換,字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,預(yù)處理程序?qū)λ蛔魅魏螜z查。如有錯(cuò)誤,只能在編譯已被宏展開(kāi)后的源程序時(shí)發(fā)現(xiàn)。

注意.宏定義不是說(shuō)明或語(yǔ)句,在行末不必加分號(hào),如加上分號(hào)則連分號(hào)也一起置換。宏定義其作用域?yàn)楹甓x命令起到源程序結(jié)束。如要終止其作用域可使用#undef命令

帶參數(shù)的宏 :     像函數(shù)的宏,一般的定義形式 :帶參宏定義的一般形式為:**#define 宏名**(形參表)字符串,也是沒(méi)有結(jié)尾的分號(hào),可以帶多個(gè)參數(shù) ,#define NB(a,b)((a)>(b)?(b):(a)),  也可以組合(嵌套)使用其他宏,注意 帶參數(shù)宏的原則 一切都要有括號(hào),參數(shù)出現(xiàn)的每個(gè)地方都要有括號(hào)。帶參數(shù)的宏在大型的程序的代碼中使用非常普遍,在#和##這兩個(gè)運(yùn)算符的幫助下可以很復(fù)雜,如“產(chǎn)生函數(shù)”,但是有些宏會(huì)被inline函數(shù)代替(C++的函數(shù))

使用宏好處:      “提高運(yùn)行效”。定義的標(biāo)識(shí)符不占內(nèi)存,只是一個(gè)臨時(shí)的符號(hào),預(yù)編譯后這個(gè)符號(hào)就不存在了。在簡(jiǎn)單的程序使用帶參數(shù)的宏定義可完成函數(shù)調(diào)用的功能,又能減少系統(tǒng)開(kāi)銷(xiāo),提高運(yùn)行效率。正如C語(yǔ)言中所講,函數(shù)的使用可以使程序更加模塊化,便于組織,而且可重復(fù)利用。      “方便程序的修改”。使用宏定義可以用宏代替一個(gè)在程序中經(jīng)常使用的常量。注意,是“經(jīng)常”使用的。這樣,當(dāng)需要改變這個(gè)常量的值時(shí),就不需要對(duì)整個(gè)程序一個(gè)一個(gè)進(jìn)行修改,只需修改宏定義中的常量即可。且當(dāng)常量比較長(zhǎng)時(shí),使用宏就可以用較短的有意義的標(biāo)識(shí)符來(lái)代替它,這樣編程的時(shí)候就會(huì)更方便,不容易出錯(cuò)。因此,宏定義的優(yōu)點(diǎn)就是方便和易于維護(hù)。

//例子:/求球的體積

#include<stdio.h>
#include<math.h>
//對(duì)于半徑為 r 的球,其體積的計(jì)算公式為 V =4/3*Π*r^3  
//這里取Π為3.14
//這里給定r的值,求V
#define PI 3.14

int main(void) {

 double r;
 scanf("%lf", &r);
 double sum = 0;

 sum = (4.0 / 3.0) * PI*pow(r, 3);//這里用PI替換掉了 3.14

 printf("%f.2", sum);

}

#include<stdio.h>//合例子:輸入數(shù)字查看是星期幾
int main(void) {

 enum week {Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun}today;
 //在這里我們給Mon賦值了一,后面Tue以后的都相應(yīng)加一賦值
 scanf("%d", &today);

 switch (today) {

 case Mon: puts("Monday"); break;
 case Tue: puts("Tuesday"); break;
 case Wed: puts("Wednesday"); break;
 case Thu: puts("Thursday"); break;
 case Fri: puts("Friday"); break;
 case Sat: puts("Saturday"); break;
 case Sun: puts("Sunday"); break;

 defaultputs("no day"); 
 }

 return 0;

}

2、enum枚舉

枚舉型是一個(gè)集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗號(hào),隔開(kāi)。它是一種用戶(hù)定義的數(shù)據(jù)類(lèi)型,它用關(guān)鍵字enum以如下語(yǔ)法來(lái)聲明,:enum 枚舉類(lèi)型名字,{名字0,...,名字n};第一個(gè)枚舉成員的默認(rèn)值為整型的0,后續(xù)枚舉成員的值在前一個(gè)成員上加1 (當(dāng)然這個(gè)是可以自定義成員值的)

枚舉類(lèi)型名字通常并不真的使用,要用的是在它大括號(hào)里邊的名字,因?yàn)樗鼈兙褪浅A糠?hào),它們的類(lèi)型是int,值則是依次從零到n,如 enum  week { Monday,Tuoesday,Wedenday};  就創(chuàng)建了三個(gè)常量,Monday的值是0,Tuoesday是1,Wedenday是2,當(dāng)需要一些可以可以排列起來(lái)的常量值的時(shí)候,定義枚舉的意義就是給了這些常量名字。雖然枚舉類(lèi)型可以當(dāng)類(lèi)型使用,但是實(shí)際上并不常用,但是如果是有意是排比名字,用枚舉比宏定義方便,枚舉比用好些,因?yàn)槊杜e有int類(lèi)型,在C 語(yǔ)言中,枚舉類(lèi)型是被當(dāng)做 int 或者 unsigned int 類(lèi)型來(lái)處理的,既然枚舉也是一種數(shù)據(jù)類(lèi)型,所以它和基本數(shù)據(jù)類(lèi)型一樣也可以對(duì)變量進(jìn)行聲明,枚舉也可以用typedef關(guān)鍵字將枚舉類(lèi)型定義成別名,并利用該別名進(jìn)行變量聲明

注意:1、同一個(gè)程序中不能定義同名的枚舉類(lèi)型,不同的枚舉類(lèi)型中也不能存在同名的命名常量

2、枚舉成員)是「常量」而不是變量,這個(gè)一定要搞清楚,因?yàn)槊杜e成員的是常量,所以不能對(duì)它們賦值,只能將它們的值賦給其他的變量

3、枚舉類(lèi)型的定義和變量的聲明分開(kāi):如果對(duì)枚舉型的變量賦整數(shù)值時(shí),需要進(jìn)行類(lèi)型轉(zhuǎn)換

enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };//枚舉常量的值是可以在這里進(jìn)行自定義的  MON=1
//基本數(shù)據(jù)類(lèi)型的賦值  : 
 int a, b, c;       
 a = 1;       
  b = 2;  
  c = 3;   
  //使用枚舉賦值   :
 enum DAY yesterday, today, tomorrow;//枚舉定義變量       
 yesterday = MON;  
  today     = TUE;   
 tomorrow  = WED;
//  today = (enum DAY) (yesterday + 1);//強(qiáng)制類(lèi)型轉(zhuǎn)換
//  tomorrow = (enum DAY) 30; 

//強(qiáng)制類(lèi)型轉(zhuǎn)換//tomorrow = 3; //錯(cuò)誤

枚舉在用switch-case結(jié)構(gòu)中使用非常方便.

//綜合例子:輸入數(shù)字查看是星期幾
#include <stdio.h>//枚舉是define的代替  它是一個(gè)集合  //和switch連用很方便

int main() {
    
 enum  week { Mon = 1,Tues, Wed, Thurs, Fri, Sat, Sun } day;  //day可放到這

 //enum week day;定義

 scanf("%d", &day);

 switch (day) {

 case Mon: puts("Monday"); break;//1  puts代替printf輸出字符串

 case Tues: puts("Tuesday"); break;// 2

 case Wed: puts("Wednesday"); break;// 3

 case Thurs: puts("Thursday"); break;// 4

 case Fri: puts("Friday"); break;// 5

 case Sat: puts("Saturday"); break;// 6

 case Sun: puts("Sunday"); break;// 7

 defaultputs("Error!");

 }

 return 0;

}

枚舉型是預(yù)處理指令#define的替代,枚舉和宏其實(shí)非常類(lèi)似,宏在「預(yù)處理階段」將名字替換成對(duì)應(yīng)的值,枚舉在「編譯階段」將名字替換成對(duì)應(yīng)的值,其中一個(gè)枚舉常量的占的字節(jié)數(shù)為4個(gè)字節(jié),恰好和int類(lèi)型的變量占的字節(jié)數(shù)相同

3、struct 結(jié)構(gòu)體

struct即結(jié)構(gòu)體,C程序中經(jīng)常需要用相關(guān)的不同類(lèi)型的數(shù)據(jù)來(lái)描述一個(gè)數(shù)據(jù)對(duì)象。例如,描述學(xué)生的綜合信息時(shí),需要使用學(xué)生的學(xué)號(hào)、姓名、性別等不同類(lèi)型的數(shù)據(jù)時(shí),像這種數(shù)據(jù)類(lèi)型總是在一起出現(xiàn),那么我們不如把這些變量裝入同一個(gè)“文件夾”中,這時(shí)用的關(guān)鍵字struct聲明的一種數(shù)據(jù)類(lèi)型就是表示這個(gè)“文件夾”的使用。那么在說(shuō)明和使用之前必須先定義它,也就是構(gòu)造它。如同在說(shuō)明和調(diào)用函數(shù)之前要先定義一樣。結(jié)構(gòu)體是一種集合,它里面包含了多個(gè)變量或數(shù)組,它們的類(lèi)型可以相同,也可以不同,每個(gè)這樣的變量或數(shù)組都稱(chēng)為結(jié)構(gòu)體的成員,結(jié)構(gòu)體也是一種數(shù)據(jù)類(lèi)型,它由程序員自己定義,可以包含多個(gè)其他類(lèi)型的數(shù)據(jù),成員又稱(chēng)為成員變量,它是結(jié)構(gòu)體所包含的若干個(gè)基本的結(jié)構(gòu)類(lèi)型,必須用“{}”括起來(lái),并且要以分號(hào)結(jié)束,每個(gè)成員應(yīng)表明具體的數(shù)據(jù)類(lèi)型,成員一般用名字訪問(wèn)。結(jié)構(gòu)體和數(shù)組類(lèi)似,也是一組數(shù)據(jù)的集合,整體使用沒(méi)有太大的意義。數(shù)組使用下標(biāo)[ ]獲訪問(wèn)元素,結(jié)構(gòu)體使用點(diǎn)號(hào).訪問(wèn)單個(gè)成員。通過(guò)這種方式可以獲取成員的值,也可以給成員賦值

數(shù)組:a[0]=10;   結(jié)構(gòu)體:today.day  (指針結(jié)構(gòu)體用->訪問(wèn)) 結(jié)構(gòu)體的成員可以包含其他結(jié)構(gòu)體,也可以包含指向自己結(jié)構(gòu)體類(lèi)型的指針,而通常這種指針的應(yīng)用是為了實(shí)現(xiàn)一些更高級(jí)的數(shù)據(jù)結(jié)構(gòu)如鏈表和樹(shù)等。

聲明定義結(jié)構(gòu):

struct關(guān)鍵字+結(jié)構(gòu)體的標(biāo)志名+大括號(hào)里邊是成員+}后面的聲明此結(jié)構(gòu)變量+末尾分號(hào),一般有這些:

struct week{定義一                struct{定義二                     struct week {定義三
int x;    int x;      int x;
char y;    char y;      int y;
};    }p1,p2;//在這里聲明變量   }p1,p2;
    //p1和p2都是一種無(wú)名結(jié)構(gòu),  //常用的一種結(jié)構(gòu)定義聲
struct week p1,p2;  // 里邊有X和y 訪問(wèn)一樣用.   明形式 
//聲明變量p1,p2,里邊都是week的值     
//里邊有x和y的值        
//用.訪問(wèn) :p1.x p2.x      
 //    p1.y, p2.y     

對(duì)于第一和第三種形式,都聲明了結(jié)構(gòu)名week,但是第二種沒(méi)有聲明結(jié)構(gòu)名,只是定義了兩個(gè)結(jié)構(gòu)變量,
這種叫無(wú)名結(jié)構(gòu)

無(wú)名結(jié)構(gòu): 可以定義無(wú)名結(jié)構(gòu)體類(lèi)型的變量。編譯器對(duì)無(wú)名結(jié)構(gòu)體的處理是隨機(jī)生成一個(gè)不重復(fù)的變量名。
無(wú)名結(jié)構(gòu)的定義方式就是定義無(wú)名結(jié)構(gòu)體時(shí)必須定義該結(jié)構(gòu)體類(lèi)型的至少一個(gè)變量。

優(yōu)點(diǎn):無(wú)名結(jié)構(gòu)體的妙用就是可以避免相同類(lèi)型的結(jié)構(gòu)體的重復(fù)定義,
這樣可以對(duì)每一個(gè)具體類(lèi)型的隊(duì)列都可以定義一個(gè)結(jié)構(gòu)體來(lái)管理該隊(duì)列的頭尾指針,
即使定義多個(gè)相同具體類(lèi)型的隊(duì)列也不會(huì)引發(fā)重復(fù)定義的編譯錯(cuò)誤。這樣定義了兩個(gè)隊(duì)列,
其元素類(lèi)型均為int類(lèi)型,同時(shí)各得到了一個(gè)維護(hù)隊(duì)列頭尾指針的結(jié)構(gòu)體

缺點(diǎn):這里定義了一個(gè)無(wú)名的結(jié)構(gòu)體,同時(shí)聲明了三個(gè)此種類(lèi)型的變量。
但是,因?yàn)闆](méi)有名字,我們?cè)谶@句之后,無(wú)法內(nèi)再定義與那三種變量相同類(lèi)型的變量了。
除非你再容次去定義一個(gè)這樣的相同的結(jié)構(gòu)體類(lèi)型。
還有一個(gè)重要的原因就是沒(méi)有辦法在其他位置定義我們所需要的結(jié)構(gòu)體變量,
每次需要新定義結(jié)構(gòu)體變量的時(shí)候都必須要找到最開(kāi)始結(jié)構(gòu)體代碼書(shū)寫(xiě)的位置才能定義新的結(jié)構(gòu)體 
 
所以實(shí)際編程中無(wú)名結(jié)構(gòu)并不常用             

注意:1、結(jié)構(gòu)體本身并不會(huì)被作為數(shù)據(jù)而開(kāi)辟內(nèi)存,真正作為數(shù)據(jù)而在內(nèi)存中存儲(chǔ)的是這種結(jié)構(gòu)體所定義的變量。

2、先聲明結(jié)構(gòu)體類(lèi)型,再定義該類(lèi)型的變量,聲明結(jié)構(gòu)體類(lèi)型,不分配空間定義結(jié)構(gòu)體類(lèi)型變量,就要分配內(nèi)存空間

3、量使用占為少的類(lèi)型,如,在可能的時(shí)候使用short代替int,「按數(shù)據(jù)類(lèi)型本身占用的位置從大到小排」

4、除了可以對(duì)成員進(jìn)行逐一賦值,也可以在定義時(shí)整體賦值:p1={struct week}{5,10}; 相當(dāng)于 p1.x=5,p1.y=10; p1=p2 表示 p1.x=p2.x ,  p1.y=p2.y; 不過(guò)整體賦值僅限于定義結(jié)構(gòu)體變量的時(shí)候,在使用過(guò)程中只能對(duì)成員逐一賦值 5、結(jié)構(gòu)體變量不能相加,相減,也不能相互乘除,但結(jié)構(gòu)體可以相互賦值,也就是說(shuō),可以將一個(gè)結(jié)構(gòu)體變量賦值給另一個(gè)結(jié)構(gòu)體變量。但是前提是這兩個(gè)結(jié)構(gòu)體變量的結(jié)構(gòu)體類(lèi)型必須相同

結(jié)構(gòu)體的運(yùn)算:要訪問(wèn)整個(gè)結(jié)構(gòu),直接用結(jié)構(gòu)變量的名字,對(duì)于整個(gè)結(jié)構(gòu),可以做賦值,取地址,也可以傳遞給函數(shù)參數(shù)

結(jié)構(gòu)體數(shù)值

嵌套的結(jié)構(gòu)體:

struct week{
int x;
int y;
strcut week at;//在結(jié)構(gòu)體又定義了名為at的一個(gè)和week同樣參數(shù)的結(jié)構(gòu)體變量
    //其中可以用.運(yùn)算符訪問(wèn)  see.at.x see.at.y
}see;
但是其實(shí)這樣的方式是不建議(非法)的,因?yàn)檫@種聲明實(shí)際上是一個(gè)無(wú)限循環(huán),成員at是一個(gè)結(jié)構(gòu)體,
at的內(nèi)部還會(huì)有成員是結(jié)構(gòu)體,依次下去,無(wú)線循環(huán)。在分配內(nèi)存的時(shí)候,由于無(wú)限嵌套,
也無(wú)法確定這個(gè)結(jié)構(gòu)體的長(zhǎng)度,所以這種方式是非法的
正確的方式是使用《結(jié)構(gòu)體指針》,因?yàn)橹羔樀拈L(zhǎng)度是確定的:

struct week{
int x;
int y;
strcut week *at;//在結(jié)構(gòu)體內(nèi)定義了一個(gè)指向和week一樣類(lèi)型的結(jié)構(gòu)指針
}see;          但是注意用指針訪問(wèn)時(shí)要用->運(yùn)算符   see.at->x

結(jié)構(gòu)體相互引用:

一個(gè)結(jié)構(gòu)體A中包含一個(gè)或多個(gè)與結(jié)構(gòu)體B相關(guān)的成員, 且結(jié)構(gòu)體B中也包含一個(gè)或多個(gè)與結(jié)構(gòu)體A相關(guān)的成員稱(chēng)為結(jié)構(gòu)體的互引用.  但是要注意:如果已經(jīng)定義了兩個(gè)結(jié)構(gòu)A和B ,在定義結(jié)構(gòu)體A的成員b時(shí),結(jié)構(gòu)體B對(duì)A還未可見(jiàn),故此時(shí)編譯器會(huì)報(bào)數(shù)據(jù)類(lèi)型B未定義 解決的辦法是使用不完整聲明:

strcut A;//不完整聲明
strcut B;//不完整聲明
strcut _A{               strcut _B{
int x;     int x;
int y;               int y;
struct _B a;    struct _A b;  //在結(jié)構(gòu)B中定義了一個(gè)名為b的和A結(jié)構(gòu)一樣類(lèi)型的結(jié)構(gòu)變量
             //其中可以用點(diǎn)訪問(wèn) A.a.x   B.b.x
}A;                      }B;
//但是注意這種方式犯了一個(gè)和上面第一個(gè)嵌套結(jié)構(gòu)的錯(cuò)誤,就是結(jié)構(gòu)體A和B都是直接包含了對(duì)方,
正確的用法還是使用指針:
strcut _A{               strcut _B{
int x;     int x;
int y;               int y;
struct _B *a;   struct _A *b;  //在結(jié)構(gòu)B中定義了一個(gè)名為b的和A結(jié)構(gòu)一樣類(lèi)型的結(jié)構(gòu)指針
                   //其中指針要用->訪問(wèn) A.a->x   B.b->x
}A;                                 }B; 
//但是注意這種方式犯了一個(gè)和上面第一個(gè)嵌套結(jié)構(gòu)的錯(cuò)誤,就是結(jié)構(gòu)體A和B都是直接包含了對(duì)方,正確的用法還是使用指針:
strcut _A{               strcut _B{
int x;           int x;
int y;               int y;
struct _B *a;     struct _A *b;  //在結(jié)構(gòu)B中定義了一個(gè)名為b的和A結(jié)構(gòu)一樣類(lèi)型的結(jié)構(gòu)指針
             //其中指針要用->訪問(wèn) A.a->x   B.b->x
}A;                                }B;
//所以使用互引用要注意:至少有一個(gè)結(jié)構(gòu)必須在另一個(gè)結(jié)構(gòu)體中以指針的形式被引用。

結(jié)構(gòu)體函數(shù)與函數(shù)參數(shù)

結(jié)構(gòu)體做函數(shù)形參:

整個(gè)結(jié)構(gòu)可以作為參數(shù)的值傳入函數(shù),這時(shí)候是在函數(shù)內(nèi)新建一個(gè)結(jié)構(gòu)變量,并復(fù)制調(diào)用者結(jié)構(gòu)的值,也可以返回一個(gè)值,這和數(shù)組完全不同 用結(jié)構(gòu)體變量作實(shí)參時(shí),采取的也是“值傳遞”方式,將  結(jié)構(gòu)體變量所占的內(nèi)存單元的內(nèi)容(結(jié)構(gòu)體變量成員列表)   全部順序傳遞給形參,這里形參也得是結(jié)構(gòu)體變量。

#include<stdio.h>
typedef struct _node {

 int n;
 char a[100];

}NODE;

void add(NODE a);//這種形式只是用來(lái)做值的傳遞

int main(void) {
 //以傳值方式傳遞結(jié)構(gòu)需要對(duì)整個(gè)結(jié)構(gòu)做一份拷貝
 NODE t;
 scanf("%d %d", &t.a[0], &t.n);//輸入1  3

 printf("1-%d %d\n",t.a[0],t.n);//輸出 1   3

 add(t);
 printf("3-%d %d\n", t.a[0], t.n);//輸出1  3

//也就是說(shuō)在add函數(shù)里邊做修改根本就影響不了主函數(shù)這邊的值
}

void add(NODE a) {

 a.a[0] = 100;//在這里能接受到NODE結(jié)構(gòu)里邊的成員
 a.n = 666;

 printf("2-%d %d\n", a.a[0], a.n);//輸出100   666

}
 ****//解決辦法是用指針(也是經(jīng)常用的方式):****
#include<stdio.h>
typedef struct _node {

 int n;
 char a[100];

}NODE;

int  add(NODE a);//這種形式只是用來(lái)做值的傳遞

int main(void) {
 //以傳值方式傳遞結(jié)構(gòu)需要對(duì)整個(gè)結(jié)構(gòu)做一份拷貝
 NODE t;
 scanf("%d %d", &t.a[0], &t.n);//輸入1  3

 printf("1-%d %d\n",t.a[0],t.n);//輸出 1   3


 add(&t);//這里傳進(jìn)去的是t的地址
 printf("3-%d %d\n", t.a[0], t.n);//輸出100  666
//傳進(jìn)去的是地址,所以就可以達(dá)到訪問(wèn)同一個(gè)變量的操作
}

int  add(NODE *) {//定義一個(gè)結(jié)構(gòu)指針

 a.a[0] = 100;//在這里能接受到NODE結(jié)構(gòu)里邊的成員
 a.n = 666;

 printf("2-%d %d\n", a.a[0], a.n);//輸出100   666
 return a;//這里返回的是指針  所以能達(dá)到訪問(wèn)主函數(shù)里邊調(diào)用的值
 //使用指針才可以用返回值
}
//常用的方式

另一種做法

結(jié)構(gòu)體做函數(shù):

/*上面的第一個(gè)的方案,把一個(gè)結(jié)構(gòu)傳入了函數(shù),然后在函數(shù)中操作,但是沒(méi)有返回回去
問(wèn)題在于傳入函數(shù)的是外面那個(gè)結(jié)構(gòu)的克隆體,而不是指針,傳入結(jié)構(gòu)和傳入數(shù)組是不同的,
解決辦法是在這個(gè)輸入函數(shù)中,在里邊創(chuàng)建一個(gè)臨時(shí)的結(jié)構(gòu)變量,然后把這個(gè)結(jié)構(gòu)返回給調(diào)用者*/

#include<stdio.h>
typedef struct _node {
 int x;
 int y;
}NODE;
struct _node add();//定義結(jié)構(gòu)類(lèi)型的函數(shù)
int main(void) {

 NODE a;
 a.x = 0;
 a.y = 0;
 printf("1-%d %d\n", a.x, a.y);//   0 0

 a = add();//函數(shù)調(diào)用   /把n的值又返回到a

 printf("3-%d %d\n", a.x, a.y);//所以在這里的時(shí)候值已經(jīng)被改變
 return 0;
}

struct _node add() {

 NODE n;
 scanf("%d", &n.x);//輸入1  3

 scanf("%d", &n.y);

 printf("2-%d %d\n", n.x, n.y);//在這里的時(shí)候賦值就成功了

 //return n;//把n的值帶回出去
}
//這種方法也能達(dá)到“改變"的效果,但是往往開(kāi)銷(xiāo)內(nèi)存較大,所以一般情況都是使用指針比較方便

用結(jié)構(gòu)體變量名作參數(shù),這種傳遞方式是單向的,如果在執(zhí)行被調(diào)函數(shù)期間改變了形參(也是結(jié)構(gòu)體變量)的值,該值不能返回主調(diào)函數(shù),這往往造成使用上的不便,因此一般少用這種方法。

C語(yǔ)言學(xué)習(xí)資源匯總【最新版】

和本地變量一樣。在函數(shù)內(nèi)部聲明的結(jié)構(gòu)只能在函數(shù)內(nèi)部使用,所以通常在函數(shù)外部聲明一個(gè)結(jié)構(gòu)類(lèi)型的,這樣就可以被多個(gè)函數(shù)所使用

//結(jié)構(gòu)做函數(shù)參數(shù)例子 (輸入今天計(jì)算明天)
#include<stdio.h>
#include<stdbool.h>//利用布爾數(shù)據(jù)類(lèi)型
struct date {
 int year;
 int month;
 int day;

};

bool If(struct date p);//判斷是否是閏年
int number(struct date c);//判斷是否是此月最后一天

int main(void) {

 struct date today,tomorrow;
 printf("年-月-日\(chéng)n");
 scanf("%d %d %d", &today.year, &today.month, &today.day);

 //前面兩個(gè)判斷 是否此月最后一天  是否此年此月最后一天  
 if (today.day==number(today)&&today.month!=12) {//首月1號(hào)
  tomorrow.day = 1;
  tomorrow.month =today.month+1;
  tomorrow.year = today.year;
 }
 else if (today.day == number(today) && today.month == 12) {//下一年
  tomorrow.day = 1;
  tomorrow.month = 1;
  tomorrow.year =today.year+1;
 }
 else {
  tomorrow.day =today.day+1;
  tomorrow.month = today.month;
  tomorrow.year = today.year;
 }

 printf("明天是%d-%d-%d\n", tomorrow.year, tomorrow.month, tomorrow.day);
 return 0;
}

int number(struct date c)//這里的形參接收的today結(jié)構(gòu)體數(shù)據(jù)
{
 int day;
 const int a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//這個(gè)月最大的天數(shù)

 if (c.month==22&&If(c)) {//查看是否是二月并且是潤(rùn)年
  day = 29;//是潤(rùn)年
 }
 else {

  day = a[c.month - 1];
 }

 return day;
}

bool If(struct date p) {//這里的形參接收的today結(jié)構(gòu)體數(shù)據(jù)
 //潤(rùn)年的特點(diǎn),能被4整除,但不能被100整數(shù),能被100整除,但是不能被400整除
 if (p.year % 4 == 0 && p.year / 100 != 0 || p.year % 400 == 0) {
  return true;
 }
 else {
  return false;
 }
}
//結(jié)構(gòu)體做函數(shù)例子 (計(jì)算下一秒)
#include<stdio.h>
struct time {
 int hour;
 int minute;
 int second;
};

struct time times(struct time now);//利用結(jié)構(gòu)做函數(shù)返回值,形參也是使用結(jié)構(gòu)體做為傳值

int main(void) {
 struct time nows[5] = {
  {11,50,20},{13,25,59},{12,59,59},{23,59,59},{00,00,00},
 };

 int i;
 for (i = 0; i < 5; i++) {
  printf("時(shí)間是 %d:%d:%d\n", nows[i].hour, nows[i].minute, nows[i].second);

  nows[i] = times(nows[i]);

  printf("下一秒是 %d:%d:%d\n", nows[i].hour, nows[i].minute, nows[i].second);
 }

 return 0;

}

struct time times(struct time now) {

 now.second++;
 if (now.second == 60) {//60秒
  now.minute++;
  now.second = 0;

  if (now.minute == 60)//60分
  {
   now.hour++;
   now.minute = 0;
   now.second = 0;

   if (now.hour == 24) {//零點(diǎn)
    now.hour=0;
    now.minute = 0;
    now.second = 0;
   }
  }
 }

 return now;//返回類(lèi)型必須也函數(shù)類(lèi)型一致,換句話說(shuō)只有結(jié)構(gòu)體類(lèi)型才能返回結(jié)構(gòu)體類(lèi)型

}

結(jié)構(gòu)體數(shù)組

結(jié)構(gòu)體數(shù)組,是指數(shù)組中的每個(gè)元素都是一個(gè)結(jié)構(gòu)體。在實(shí)際應(yīng)用中,C語(yǔ)言結(jié)構(gòu)體數(shù)組常被用來(lái)表示一個(gè)擁有相同數(shù)據(jù)結(jié)構(gòu)的群體,比如一個(gè)班的學(xué)生、一個(gè)車(chē)間的職工等。結(jié)構(gòu)體可以存儲(chǔ)不同的數(shù)據(jù)類(lèi)型,將他們互相聯(lián)系起來(lái)。結(jié)構(gòu)體數(shù)組可以連續(xù)存儲(chǔ)多個(gè)結(jié)構(gòu)體,和數(shù)組作用相似。比如想定義同一個(gè)最小外接矩形的四個(gè)坐標(biāo)值,并給予這個(gè)矩形一個(gè)特征編號(hào)。當(dāng)需要存儲(chǔ)多個(gè)最小外接矩形的信息時(shí),就需要?jiǎng)討B(tài)申請(qǐng)一個(gè)結(jié)構(gòu)體數(shù)組

定義結(jié)構(gòu)體數(shù)組的方法很簡(jiǎn)單,同定義結(jié)構(gòu)體變量是一樣的,只不過(guò)將變量改成數(shù)組?;蛘哒f(shuō)同前面介紹的普通數(shù)組的定義是一模一樣的:struct student  tp[10]; 這就定義了一個(gè)結(jié)構(gòu)體數(shù)組,共有 10 個(gè)元素,每個(gè)元素都是一個(gè)結(jié)構(gòu)體變量,都包含所有的結(jié)構(gòu)體成員。

結(jié)構(gòu)體數(shù)組的初始化與前面講的數(shù)值型數(shù)組的初始化也是一樣的,數(shù)值型數(shù)組初始化的方法和需要注意的問(wèn)題在結(jié)構(gòu)體數(shù)組的初始化中同樣適用,因?yàn)椴还苁菙?shù)值型數(shù)組還是結(jié)構(gòu)體數(shù)組都是數(shù)組。

//例子:  //尋找學(xué)生中 學(xué)號(hào)最大的
include <stdio.h>
include <string.h>

struct STU
{

 char name[20];
 int age;
 char sex[20];
 char num[20];

};

void OutputSTU(struct STU stu[]);  //函數(shù)聲明, 該函數(shù)的功能是輸出成績(jī)最大的學(xué)生信息

int main(void)
{
 int i;
 struct STU stu[5];

 for (i = 0; i < 2; ++i)
 {
  printf("請(qǐng)按照名字、年齡、性別、學(xué)號(hào)(1-9數(shù)字)輸入第%d個(gè)學(xué)生的信息:", i + 1);

  scanf("%s %d %s %s", stu[i].name, &stu[i].age, stu[i].sex, stu[i].num);/*%c前面要加空格, 不然輸入時(shí)會(huì)將空格賦給%c*/
 }

 OutputSTU(stu);

 return 0;
}

void OutputSTU(struct STU stu[])
{
 struct STU stumax = stu[0];//讓臨時(shí)結(jié)構(gòu)stumax保存第一個(gè)學(xué)生的信息

 int j;
 for (j = 1; j < 2; ++j)//第一個(gè)學(xué)生依次和后面的學(xué)生比較
 {
  if (strcmp(stumax.num, stu[j].num) < 0)  //strcmp函數(shù)的使用  s1>s2:1   s1<s2:-1
  {
   stumax = stu[j];//讓臨時(shí)結(jié)構(gòu)保存那個(gè)學(xué)生的信息
  }
 }

 printf("學(xué)生姓名:%s 學(xué)生年齡:%d 學(xué)生性別:%s 學(xué)生分?jǐn)?shù):%s\n", stumax.name, stumax.age, stumax.sex, stumax.num);

}

結(jié)構(gòu)體指針

和數(shù)組不同,結(jié)構(gòu)變量的名字并不是結(jié)構(gòu)變量的地址,必須使用&運(yùn)算符  strcut node *tp=&nb;  指針一般用->訪問(wèn)結(jié)構(gòu)體里邊的成員

指針變量非常靈活方便,可以指向任一類(lèi)型的變量    ,若定義指針變量指向結(jié)構(gòu)體類(lèi)型變量,則可以通過(guò)指針來(lái)引用結(jié)構(gòu)體類(lèi)型變量。

#include<stdio.h>
struct node{
int x;
int y;
}my;
int main(void) {
 struct node *p = &my;//定義了一個(gè)指針p指向了my的結(jié)構(gòu)體

 p->x = 11;//這是一種訪問(wèn)方式(常用的方式)
 (*p).x = 12;//這是第二種方式,
 printf("%d", p->x);//輸出是12

}
以下 2 種形式是等價(jià)的:
(*指針變量).成員名。
指針變量->成員名。
其中第 2 種方式很重要,通常都是使用這種方式,另外兩種方式用得不多。
后面講鏈表的時(shí)候用的也都是第 3 種方式。

這里說(shuō)明:結(jié)構(gòu)體和結(jié)構(gòu)體變量是兩個(gè)不同的概念:結(jié)構(gòu)體是一種數(shù)據(jù)類(lèi)型,是一種創(chuàng)建變量的模板,編譯器不會(huì)為它分配內(nèi)存空間,就像 int、float、char 這些關(guān)鍵字本身不占用內(nèi)存一樣;結(jié)構(gòu)體變量才包含實(shí)實(shí)在在的數(shù)據(jù),才需要內(nèi)存來(lái)存儲(chǔ)。所以用一個(gè)結(jié)構(gòu)體去取一個(gè)結(jié)構(gòu)體名的地址,這種寫(xiě)法是錯(cuò)誤的,也不能將它賦值給其他變量。

#include<stdio.h>
struct point {
 int x;
 int y;
};
struct point *gt(struct point*p);//結(jié)構(gòu)指針函數(shù)

void  print(const struct point *p);//結(jié)構(gòu)指針

void out(struct point p);//普通的結(jié)構(gòu)體做函數(shù)參數(shù)

int main(void) {
 struct point y = { 0,0 };//以point結(jié)構(gòu)定義一個(gè)y的結(jié)構(gòu)變量

 //以下三種調(diào)用  等價(jià)
 //注意gt是一個(gè)結(jié)構(gòu)體的指針函數(shù)
 gt(&y); //這是一個(gè)函數(shù)的返回結(jié)果函數(shù)  //取y結(jié)構(gòu)的地址傳入函數(shù)
 out(y);
 out(*gt(&y));   // (里邊)的都是做為參數(shù)  *gt(&y)做為指針?lè)祷刂?nbsp; 這個(gè)函數(shù)它的返回用指針表示
 print(gt(&y));  //gt(&y)是一個(gè)返回值   這樣表示的是利用gt函數(shù)的返回值在print函數(shù)里邊操作

 //*get(&y) = (struct point){ 1,2 };  //這也可以做的
}

struct point* gt(struct point*p) {// *p要的是&y的地址
 
 scanf("%d", &p->x);
 scanf("%d", &p->y);
 printf("a=%d,%d \n", p->x, p->y);//用->來(lái)訪問(wèn)指針結(jié)構(gòu)里邊的成員

 return p;// 用完指針后 返回指針
}
void out(struct point p) {
 printf("b=%d,%d\n", p.x, p.y);
}

void print(const struct point *p) {//加上const表示不再改動(dòng)參數(shù)
 printf("c=%d,%d\n", p->x, p->y);
}
  • 指向結(jié)構(gòu)體數(shù)組的指針:

    在之前講數(shù)值型數(shù)組的時(shí)候可以將數(shù)組名賦給一個(gè)指針變量,從而使該指針變量指向數(shù)組的首地址,然后用指針訪問(wèn)數(shù)組的元素。結(jié)構(gòu)體數(shù)組也是數(shù)組,所以同樣可以這么做。

我們知道,結(jié)構(gòu)體數(shù)組的每一個(gè)元素都是一個(gè)結(jié)構(gòu)體變量。如果定義一個(gè)結(jié)構(gòu)體指針變量并把結(jié)構(gòu)體數(shù)組的數(shù)組名賦給這個(gè)指針變量的話,就意味著將結(jié)構(gòu)體數(shù)組的第一個(gè)元素,即第一個(gè)結(jié)構(gòu)體變量的地址,也即第一個(gè)結(jié)構(gòu)變量中的第一個(gè)成員的地址賦給了這個(gè)指針變量

include <stdio.h>
struct qt
{

 char name[5];
 int age;
 char sex[5];
 double scroe;
};
int main(void)
{    //定義了一個(gè)student的結(jié)構(gòu)數(shù)組
 struct qt student[5] = { {"李青"20"男"99}, {"黃歡"20,  "女"80}, {"七七"23"男"95} };
 struct qt *p = student;
 int i;
 for (i = 0; i < 5; i++) {

  printf("%s ", p->name);//利用->可訪問(wèn)成員(訪問(wèn)意味著可以讀寫(xiě))
  printf("%d ", p->age);
  printf("%s ", p->sex);
  printf("%f ", p->scroe);
 }
 return 0;
}
當(dāng)結(jié)構(gòu)體指針變量指向一個(gè)結(jié)構(gòu)體變量數(shù)組的時(shí)候,此時(shí)指針變量的值就是結(jié)構(gòu)體數(shù)組的首地址,
此時(shí)指針變量 p 就指向了結(jié)構(gòu)體數(shù)組的第一個(gè)元素,即指向 student[0]。我們知道,
當(dāng)一個(gè)指針指向一個(gè)數(shù)組后,指針就可以通過(guò)移動(dòng)的方式指向數(shù)組的其他元素。
這個(gè)原則對(duì)結(jié)構(gòu)體數(shù)組和結(jié)構(gòu)體指針同樣適用,所以 p + 1 就指向 student[1] 的首地址;p + 2 就指向 
student[2] 的首地址……所以只要利用 for 循環(huán),指針就能一個(gè)個(gè)地指向結(jié)構(gòu)體數(shù)組元素。

同樣需要注意的是,要將一個(gè)結(jié)構(gòu)體數(shù)組名賦給一個(gè)結(jié)構(gòu)體指針變量,那么它們的結(jié)構(gòu)體類(lèi)型必須相同。

typedef 別名

typedef是在編程語(yǔ)言中用來(lái)為復(fù)雜的聲明定義簡(jiǎn)單的別名,新的名字是某種類(lèi)型的別名,這樣做改善了程序的可讀性,它與宏定義有些差異。它本身是一種存儲(chǔ)類(lèi)的關(guān)鍵字,與auto、extern、mutable、static、register等關(guān)鍵字不能出現(xiàn)在同一個(gè)表達(dá)式中。

typedef為C語(yǔ)言的關(guān)鍵字,功能是用來(lái)聲明一個(gè)已有的數(shù)據(jù)類(lèi)型的新名字,比如 typedef int last ;  這就使得last成為 int 類(lèi)型的別名  這樣last這個(gè)名字就可以代替int出現(xiàn)在變量定義和參數(shù)聲明的地方了

typedef也有一個(gè)特別的長(zhǎng)處:它符合范圍規(guī)則,使用typedef定義的變量類(lèi)型其作用范圍限制在所定義的函數(shù)或者文件內(nèi)(取決于此變量定義的位置),而宏定義則沒(méi)有這種特性。

typedef & 復(fù)雜的變量聲明
理解復(fù)雜聲明可用的“右左法則”:
  從變量名看起,先往右,再往左,碰到一個(gè)圓括號(hào)就調(diào)轉(zhuǎn)閱讀的方向;括號(hào)內(nèi)分析完就跳出括號(hào),
還是按先右后左的順序,如此循環(huán),直到整個(gè)聲明分析完。舉例:
  int (*func)(int *p);
  首 先找到變量名func,外面有一對(duì)圓括號(hào),而且左邊是一個(gè)*號(hào),這說(shuō)明func是一個(gè)指針;
然后跳出這個(gè)圓括號(hào),先看右邊,又遇到圓括號(hào)(只有函數(shù)后面才跟形參圓括號(hào)),
這說(shuō)明 (*func)是一個(gè)函數(shù),所以func是一個(gè)指向這類(lèi)函數(shù)的指針,即函數(shù)指針,
這類(lèi)函數(shù)具有int*類(lèi)型的形參,返回值類(lèi)型是int,此處就是聲明函數(shù)。
  int (*func[5])(int *);
  func 右邊是一個(gè)[]運(yùn)算符,說(shuō)明func是具有5個(gè)元素的數(shù)組;func的左邊有一個(gè)*,
說(shuō)明func的元素是指針(注意這里的*不是修飾func,而是修飾 func[5]的,原因是[]運(yùn)算符優(yōu)先級(jí)比*高,
func先跟[]結(jié)合)。跳出這個(gè)括號(hào),看右邊,又遇到圓括號(hào),說(shuō)明func數(shù)組的元素是函數(shù)類(lèi)型的指 針,
它指向的函數(shù)具有int*類(lèi)型的形參,返回值類(lèi)型為int

也可以記住2個(gè)模式:
type (*)(....)函數(shù)指針
type (*)[]數(shù)組指針復(fù)制代碼

結(jié)構(gòu)體的內(nèi)存對(duì)齊方式(存儲(chǔ)空間)

結(jié)構(gòu)體內(nèi)存對(duì)齊:一個(gè)結(jié)構(gòu)體變量定義完之后,其在內(nèi)存中的存儲(chǔ)并不等于其所包含元素的寬度之和,元素是按照定義順序一個(gè)一個(gè)放到內(nèi)存中去的,但并不是緊密排列的。從結(jié)構(gòu)體存儲(chǔ)的首地址開(kāi)始,每個(gè)元素放置到內(nèi)存中時(shí),它都會(huì)認(rèn)為內(nèi)存是按照自己的大小來(lái)劃分的,因此元素放置的位置一定會(huì)在自己寬度的整數(shù)倍上開(kāi)始。

內(nèi)存對(duì)齊可以大大提升內(nèi)存訪問(wèn)速度,是一種用空間換時(shí)間的方法。內(nèi)存不對(duì)齊會(huì)導(dǎo)致每次讀取數(shù)據(jù)都會(huì)讀取兩次,使得內(nèi)存讀取速度減慢。

cpu把內(nèi)存當(dāng)成是一塊一塊的,塊的大小可以是2,4,8,16 個(gè)字節(jié),因此CPU在讀取內(nèi)存的時(shí)候是一塊一塊進(jìn)行讀取的,塊的大小稱(chēng)為內(nèi)存讀取粒度。

// 內(nèi)存對(duì)齊原則:
//   1、第一個(gè)成員的首地址為0.
//   2、每個(gè)成員的首地址是自身大小的整數(shù)倍
//    3、結(jié)構(gòu)體的總大小,為其成員中所含最大類(lèi)型的整數(shù)倍。

#include<stdio.h>
typedef struct _node {
 //char t;//1
 //int p; //4
 //float y;//8
//char t 要存放的偏移量為0,滿(mǎn)足對(duì)齊方式,t占用一個(gè)字節(jié),
int p要存儲(chǔ)在下一個(gè)可用的地址的偏移量為1.不是sizeof(int)=4的倍數(shù),
需要補(bǔ)足3個(gè)字節(jié)才能使偏移量變?yōu)?span style="color: #d19a66;line-height: 26px;">4(使其滿(mǎn)足對(duì)齊方式),因此系統(tǒng)自動(dòng)填充3個(gè)字節(jié)使偏移量增加到4,
int p放到此位置,占用4個(gè)字節(jié),下一可用的偏移量為8,滿(mǎn)足sizeof(float)=4的對(duì)齊,
所以float y直接存放在偏移量為8的位置上,它占用4個(gè)字節(jié)  總共就是 //1+3+4+4=12

 double a;//8
 char b;//1
 int c;//4
//double a的要存放的偏移量為0,滿(mǎn)足對(duì)齊方式直接存儲(chǔ),占用8個(gè)字節(jié),
char b要存儲(chǔ)在下一的可用的地址的偏移量為9,
直接存儲(chǔ),占用字節(jié)為1;int c要存儲(chǔ)在下一個(gè)可用的地址的偏移量為9
9不滿(mǎn)足sizeofint)=4;所以系統(tǒng)會(huì)自動(dòng)分配3的字節(jié)增加到12,12滿(mǎn)足對(duì)齊方式,
存儲(chǔ)下去c占用4個(gè)字節(jié)??偣簿褪?nbsp;  //8+1+3+4=16

}NODE;

int main(void) {
 printf("%d "sizeof(NODE));
}

如果結(jié)構(gòu)體內(nèi)存在長(zhǎng)度大于處理器位數(shù)的元素,那么就以處理器的倍數(shù)為對(duì)齊單位;否則,如果結(jié)構(gòu)體內(nèi)的元素的長(zhǎng)度都小于處理器的倍數(shù)的時(shí)候,便以結(jié)構(gòu)體里面最長(zhǎng)的數(shù)據(jù)元素為對(duì)齊單位。

另外  結(jié)構(gòu)體的內(nèi)存地址就是它第一個(gè)成員變量的地址  isa永遠(yuǎn)都是結(jié)構(gòu)體中的第一個(gè)成員變量  所以結(jié)構(gòu)體的地址也就是其isa指針的地址

  • 內(nèi)存對(duì)齊簡(jiǎn)介

由于內(nèi)存的讀取時(shí)間遠(yuǎn)遠(yuǎn)小于CPU的存儲(chǔ)速度,這里用設(shè)定數(shù)據(jù)結(jié)構(gòu)的對(duì)齊系數(shù),即犧牲空間來(lái)?yè)Q取時(shí)間的思想來(lái)提高CPU的存儲(chǔ)效率。

內(nèi)存對(duì)齊”應(yīng)該是編譯器的“管轄范圍”。編譯器為程序中的每個(gè)“數(shù)據(jù)單元”安排在適當(dāng)?shù)奈恢蒙?。但是C語(yǔ)言的一個(gè)特點(diǎn)就是太靈活,太強(qiáng)大,它允許你干預(yù)“內(nèi)存對(duì)齊”。如果你想了解更加底層的秘密,“內(nèi)存對(duì)齊”對(duì)你就不應(yīng)該再模糊了。這也是一個(gè)大小端模式的問(wèn)題

每個(gè)特定平臺(tái)上的編譯器都有自己的默認(rèn)“對(duì)齊系數(shù)”(也叫對(duì)齊模數(shù))。程序員可以通過(guò)預(yù)編譯命令#pragma pack(n)來(lái)改變這一系數(shù),其中的n就是你要指定的“對(duì)齊系數(shù)”。

規(guī)則:

1、數(shù)據(jù)成員對(duì)齊規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第一個(gè)數(shù)據(jù)成員放在offset為0的地方,以后每個(gè)數(shù)據(jù)成員的對(duì)齊「按照#pragma pack指定的數(shù)值和這個(gè)數(shù)據(jù)成員自身長(zhǎng)度中,比較小的那個(gè)進(jìn)行」。

2、結(jié)構(gòu)(或聯(lián)合)的整體對(duì)齊規(guī)則:在數(shù)據(jù)成員完成各自對(duì)齊之后,結(jié)構(gòu)(或聯(lián)合)本身也要進(jìn)行對(duì)齊,對(duì)齊將「按照#pragma pack 指定的數(shù)值和結(jié)構(gòu)(或聯(lián)合) 最大數(shù)據(jù)成員長(zhǎng)度中,比較小的那個(gè)進(jìn)行」對(duì)齊。

3、結(jié)合1、2可推斷:當(dāng)#pragma pack的n值等于或超過(guò)所有數(shù)據(jù)成員長(zhǎng)度的時(shí)候,這個(gè)n值的大小將不產(chǎn)生任何效果。

  • #pragma pack(n)  設(shè)定變量以n字節(jié)為對(duì)齊方式:

    「作用」:指定結(jié)構(gòu)體、聯(lián)合以及類(lèi)成員

    「語(yǔ)法」:#pragma pack( [show] | [push | pop] [, identifier], n )

    1,pack提供數(shù)據(jù)聲明級(jí)別的控制,對(duì)定義不起作用;

    2,調(diào)用pack時(shí)不指定參數(shù),n將被設(shè)成默認(rèn)值;

    n:可選參數(shù);指定packing的數(shù)值,以字節(jié)為單位;缺省數(shù)值是8,合法的數(shù)值分別是1、2、4、8、16。其他參數(shù)都是可選的可先不了解

#include<stdio.h>
#pragma pack(2)// 值只能填1 2 4 8 16  這里最好是看結(jié)構(gòu)里邊最小的成員 這里是char 所以最好是填1  //但是當(dāng)#pragma pack指定的值等于或者超過(guò)所有數(shù)據(jù)成員長(zhǎng)度的時(shí)候,這個(gè)指定值的大小將不產(chǎn)生任何效果
typedef struct _A {

 double x;//4
 int y;//4
 char p;//1
 
}NODE;

//8+4+1+1=14按n為2

//8+4+1+3=16按n為4以上或者使用系統(tǒng)自動(dòng)對(duì)齊

#pragma pack(8)//設(shè)定為4字節(jié)對(duì)齊
typedef struct test
{

 char m1;
 double m4;
 int m3;

}NODE2;

//1+1+4+8=14//按n為2
//1+7+8+4=20 不滿(mǎn)足8的倍數(shù)  加4等于24滿(mǎn)足  總:1+7+8+4+4=24


int main(void) {

 printf("%d\n"sizeof(NODE));
 printf("%d"sizeof(NODE2));

}
結(jié)構(gòu)、聯(lián)合或者類(lèi)的數(shù)據(jù)成員,第一個(gè)放在偏移為0的地方;以后每個(gè)數(shù)據(jù)成員的對(duì)齊,
按照#pragma pack指定的數(shù)值和這個(gè)數(shù)據(jù)成員自身長(zhǎng)度兩個(gè)中比較小的那個(gè)進(jìn)行;
也就是說(shuō),當(dāng)#pragma pack指定的值等于或者超過(guò)所有數(shù)據(jù)成員長(zhǎng)度的時(shí)候,
這個(gè)指定值的大小將不產(chǎn)生任何效果

每個(gè)成員分別對(duì)齊,即每個(gè)成員按自己的方式對(duì)齊,并最小化長(zhǎng)度;規(guī)則就是每個(gè)成員按其類(lèi)型的對(duì)齊參數(shù)(通常是這個(gè)類(lèi)型的大?。┖椭付▽?duì)齊參數(shù)中較小的一個(gè)對(duì)齊。

大小端:

如:int 11 22 33 44
在存儲(chǔ)的時(shí)候
大端:11 22 33 44
  0  1   2  3
  低地址----> 高地址

小端:44 33 22 11
  0  1   2  3
  低地址----> 高地址
大小端的差異在于存放順序不同
常見(jiàn)的操作系統(tǒng)是小端,通訊協(xié)議是大端。復(fù)制代碼
//結(jié)構(gòu)體例子:使用尾插法創(chuàng)建鏈表
#include<stdio.h>//單鏈表的創(chuàng)建

typedef struct _node {

 int nb;//數(shù)值
 struct _node *nxte;//定義一個(gè)指向下一個(gè)的節(jié)點(diǎn)的指針

}NODE;

typedef struct _link{//利用這個(gè)結(jié)構(gòu)體 封裝 首尾節(jié)點(diǎn)

 NODE *head;
 NODE *qt;

}link;

void  add(link *phead, link *qt, int n);//定義函數(shù)將 首尾指針傳入

int main(void) {

 link head, q;//定義一個(gè)結(jié)構(gòu),連指針都不是的
 head.head = q.qt = NULL;//初始化

 int n;

 for (scanf("%d", &n); n != -1scanf("%d", &n)) {
  add(&head, &q, n);//將地址 值傳入
 }

 NODE *t;
 t = head.head;//利用臨時(shí)結(jié)構(gòu)將鏈表輸出
 for (; t; t = t->nxte) {
  printf("%d ", t->nb);
 }

 return 0;
}

//尾插法
void  add(link *phead, link *qt, int n) {

 NODE *p = (NODE*)malloc(sizeof(NODE));//為新結(jié)點(diǎn)開(kāi)辟空間
 p->nb = n;
 p->nxte = NULL;

 if (phead->head == NULL) {//判斷首結(jié)點(diǎn)是否為空
  phead->head = p;//是空的就讓首結(jié)點(diǎn)等于新結(jié)點(diǎn)
 }
 else {//不為空時(shí),讓尾結(jié)點(diǎn)依次跑到后面去
  qt->qt->nxte = p;
 }

 qt->qt = p;
}

4、union 共用體(聯(lián)合體)

在進(jìn)行某些算法的C語(yǔ)言編程的時(shí)候,需要使幾種不同類(lèi)型的變量存放到同一段內(nèi)存單元中。也就是使用覆蓋技術(shù),幾個(gè)變量互相覆蓋。這種幾個(gè)不同的變量共同占用一段內(nèi)存的結(jié)構(gòu),在C語(yǔ)言中 以關(guān)鍵字union聲明的一種數(shù)據(jù)結(jié)構(gòu),這種被稱(chēng)作“共用體”類(lèi)型結(jié)構(gòu),也叫聯(lián)合體。

“聯(lián)合”與“結(jié)構(gòu)”有一些相似之處。但兩者有本質(zhì)上的不同。在結(jié)構(gòu)中各成員有各自的內(nèi)存空間,一個(gè)結(jié)構(gòu)體變量的總長(zhǎng)度大于等于各成員長(zhǎng)度之和。而在“聯(lián)合”中,各成員共享一段內(nèi)存空間,一個(gè)聯(lián)合變量的長(zhǎng)度等于各成員中最長(zhǎng)的長(zhǎng)度。注意這里所謂的共享不是指把多個(gè)成員同時(shí)裝入一個(gè)聯(lián)合變量?jī)?nèi),而是指該聯(lián)合變量可被賦予任一成員值,但每次只能賦一種值,賦入新值則沖去舊值,共用體變量中起作用的成員是最后一次存放的成員,在存入一個(gè)新成員后,原有成員就失去作用,共用體變量的地址和它的各成員的地址都是同一地址

  • 一個(gè)聯(lián)合類(lèi)型必須經(jīng)過(guò)定義之后,才能把變量說(shuō)明為該聯(lián)合類(lèi)型:
聯(lián)合的定義:
定義一個(gè)聯(lián)合類(lèi)型的一般形式為:
union [name](聯(lián)合名)   name是可選的
{
成員表
};
成員表中含有若干成員,成員的一般形式為: 類(lèi)型說(shuō)明符 成員名
成員名的命名應(yīng)符合標(biāo)識(shí)符的規(guī)定。

union Data
{
   int i;
   double f;
   char  str[20];
} data;


現(xiàn)在 Data所有的成員共享一個(gè)空間,同一時(shí)間只有一個(gè)成員是的值有效的,Data 類(lèi)型的變量可以存儲(chǔ)一個(gè)整數(shù)、
一個(gè)浮點(diǎn)數(shù),或者一個(gè)字符串。這意味著一個(gè)變量(相同的內(nèi)存位置)可以存儲(chǔ)多個(gè)多種類(lèi)型的數(shù)據(jù)。
您可以根據(jù)需要在一個(gè)共用體內(nèi)使用任何內(nèi)置的或者用戶(hù)自定義的數(shù)據(jù)類(lèi)型。
共用體占用的內(nèi)存應(yīng)足夠存儲(chǔ)共用體中最大的成員。例如,在上面的實(shí)例中,
Data 將占用 20 個(gè)字節(jié)的內(nèi)存空間,因?yàn)樵诟鱾€(gè)成員中,字符串所占用的空間是最大的。復(fù)制代碼

注意:1、不能把共用體變量作為函數(shù)參數(shù),也不能是函數(shù)帶回共用體變量,但可以使專(zhuān)用指向共用體變量的指針

2、所有成員占用同一段內(nèi)存,修改一制個(gè)成員會(huì)影響其余所有成員。

  • 共用體的訪問(wèn):共用體訪問(wèn)成員的值時(shí)一般使用.運(yùn)算符,指針時(shí)用->運(yùn)算符(和結(jié)構(gòu)體是一樣的)
typedef union _node {
 int a;
 double b;
 char c;
 union _node *p;

}NODE;

int main(void) {

 NODE a;//定義變量
 NODE t;
 a.b;//用.訪問(wèn)
 t.p->a;//指針用->訪問(wèn)



}
聯(lián)合的使用規(guī)則幾乎和結(jié)構(gòu)體strtct的規(guī)則用法一樣,只不過(guò)是內(nèi)部表示的不同。

補(bǔ)充:
還有一個(gè)是無(wú)名聯(lián)合體,它是和無(wú)名結(jié)構(gòu)體的工作原理是相同的復(fù)制代碼
#include<stdio.h>//簡(jiǎn)單的例子
#include<string.h>

typedef union _node{
 int a;
 double b;
 char c[20];

}NODE;

int main(void) {

 NODE a;//這里只定義一個(gè)變量

 a.a = 666;
 printf("%d\n", a.a);

 a.b = 9.99;
 printf("%f\n", a.b);

 strcpy(a.c, "hello world!");
 printf("%s\n", a.c);

 //我們看到,三個(gè)都被完整的輸出了,因?yàn)樵谕粫r(shí)刻,只有一個(gè)成員是有效的

}

輸出:
666
9.990000
hellow world!
  • 共用體的作用:

    1、節(jié)省內(nèi)存,有兩個(gè)很長(zhǎng)的數(shù)據(jù)結(jié)構(gòu),不會(huì)同時(shí)使用,比如一個(gè)表示老師,一個(gè)表示學(xué)生,如果要統(tǒng)計(jì)教師和學(xué)生的情況用結(jié)構(gòu)體的話就有點(diǎn)浪費(fèi)了!用結(jié)構(gòu)體的話,只占用最長(zhǎng)的那個(gè)數(shù)據(jù)結(jié)構(gòu)所占用的空間,就足夠了!

    2、實(shí)現(xiàn)不同類(lèi)型數(shù)據(jù)之間的類(lèi)型轉(zhuǎn)換,遇到各種類(lèi)型的數(shù)據(jù)共用存儲(chǔ)空間,很方便的實(shí)現(xiàn)了不同數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換,不需要顯示的強(qiáng)制類(lèi)型轉(zhuǎn)換。

    其他:1、確定CPU的模式:大端、小端模式確定

    大小端不同,則存儲(chǔ)的方式也存在差別,比如int需要4個(gè)字節(jié),而char只需要1個(gè)字節(jié),根據(jù)1個(gè)字節(jié)所在的具體位置即可判定CPU的模式

    2、寄存器的定義,實(shí)現(xiàn)整體的訪問(wèn)和單項(xiàng)的訪問(wèn)

//共用體綜合例子:根據(jù)輸入的數(shù)據(jù)類(lèi)型輸出需要的相應(yīng)的數(shù)據(jù)
#include<stdio.h>
#include<string.h>//數(shù)據(jù)類(lèi)型輸出   5*4  m n     n的第幾個(gè)x 

union node {
 int a;
 double b;
 char c[30];

}add[10000];

char p[10000][30]; //保存的字符串?dāng)?shù)組

int main(void) {
 int n, m;
 scanf("%d %d", &n, &m);
 int x;
 double y;
 char t[50];
 int i, j;

 for (i = 0; i < n; i++) {//輸入
  scanf("%s", &p[i]);//作為字符串?dāng)?shù)組,需要取地址

  if (strcmp("INT", p[i]) == 0) {//整形
   scanf("%d", &x);
   add[i].a = x;
  }
  else if(strcmp("DOUBLE",p[i])==0){//浮點(diǎn)
   scanf("%lf", &y);
   add[i].b = y;
  }
  else if (strcmp("STRCING", p[i]) == 0) {//字符串
   scanf("%s", t);
   strcpy(add[i].c, t);
  }

 }

 for (i = 0; i < m; i++) {//輸出
  scanf("%d", &j);

  if (strcmp("INT", p[j]) == 0) {
   printf("%d\n", add[j].a);
  }
  else if (strcmp("DOUBLE", p[j]) == 0)
  {
   printf("%f\n", add[j].b);
  }else if(strcmp("STRING",p[j])==0)
  {
   printf("%s\n", add[j].c);

  }

 }

 return 0;

}

//輸入:
/*
5 4
INT 456
DOUBLE 123.56
DOUBLE 0.476
STRING welcomeToC
STRING LemonTree
0
1
2
4
*/


//輸出:
/*
456
123.56
0.48
LemonTree

*/


END



若覺(jué)得文章對(duì)你有幫助,隨手轉(zhuǎn)發(fā)分享,也是我們繼續(xù)更新的動(dòng)力。


長(zhǎng)按二維碼,掃掃關(guān)注哦

?「C語(yǔ)言中文網(wǎng)」官方公眾號(hào),關(guān)注手機(jī)閱讀教程 ?

瀏覽 31
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 麻豆www| 男人天堂2024| 伊人99热| 免费中文资源在线观看| 国产精品久久77777| 色婷婷国产精品视频| 天堂俺去俺来也www久久婷婷| 狠狠狠狠干| 强伦轩一区二区三区四区播放方式 | 国外操逼视频| 亚洲a电影| 污视频在线看| 亚洲综合色婷婷| 人人干人人操人人爽| 91视频福利| 免费观看黄色视频网站| 亚洲无码精品在线| 日韩精品欧美一区二区三区| 在线中文字幕第一页| www狠狠| 日韩另类视频| 日韩在线免费视频| 亚洲无码理论片| 一区二区三区久久久久〖网:.〗 | 99久久精品国产一区二区三区| 91中文字幕在线播放| 91在线成人| 蜜臀999| AV解说| 久久久久久三级电影| 豆花视频成人网站入口| 欧美性爱第四页| 无码国产精品一区二区视频| 久久免费视频6| 国产精品成人免费久久黄AV片| 亚洲一区二区三区视频| 操屄视频在线| 爱搞搞就要搞| 91在线无码精品秘软件| 囯产精品久久| 天天日夜夜草| 午夜爽爽| 99精品9| 免费做a爰片77777| 91Av视频| 亚洲精品18在线观看| 亚洲AV成人无码精品| AV无码网站| 俺来了俺去了www色官网| 欧美亚洲视频在线观看| 天天肏天天干| 日本三级片在线动| 黄色小说视频| 久草美女| 婬乱欧美一二三区| 色天堂在线观看视频| 色伊人| 十八禁网站在线| 精品成人在线视频| 重庆美女揉BBBB搡BBBB| 黄色电影一级| 日韩黄色片网站| 91人人澡人人爽人人看| 乱伦AV网| 久久不卡视频| 激情五月天婷婷| 国产精品福利在线播放| 中文字幕AV播放| 欧洲三级片网站| 中文字幕日韩亚洲| 日韩视频在线观看免费| 欧美色图狠狠干| caopro| 日本三级片网站在线观看| 亚洲精品一区二区三区无码电影| 中文天堂网| 亚洲三级国产| 豆花视频成人版www满18| 五月天黄色视频| 五月六月丁香| 成人不卡| 精品久久免费一区二区三区| 久久天天操| 日韩AV一区二区在线观看| 啊v在线| 日韩本色一区| 北条麻妃JUX-869无码播放| 国产一区二区无码| 日韩小视频+国产| 无码视频观看| 无码人妻av一区| 国产看片网站| 黄频在线免费观看| 国产成人高清无码| 91免费在线视频观看| 婷婷深爱五月| 欧美日韩A片欧美日| 婷婷国产精品| 一本一道vs波多野结衣| 九九视频免费观看| 最新免费毛片| 久久狼友| 久久综合成人| 日本少妇网站| 丰满人妻一区二区三区精品高清| 国产一级a毛一级a毛观看视频网站 | 欧美色图在线视频| A片在线观看网站| 精品三级| 国产一级AV免费观看| 黄色片在线播放| 久久久波多野结衣| 久久亚洲视频| 色欲久久久| 久久精彩偷拍视频| 亚洲.欧美.丝袜.中文.综合| 久久伊人中文字幕| 99人妻| 女生操网站| 成人一级黄片| 青青草在线观看免费| 日韩精品电影| 国产精品一| 欧美日韩小视频| 天天撸在线| 伊人网站| 超碰在线网站| 荫蒂添出高潮A片视频| 国产毛片基地| AV无码人妻| a天堂视频| 欧美黄色免费在线观看| 久热伊人| 成人片免费看| 亚洲一级av无码毛片精品| 国产成人综合视频| 最新亚洲无码在线观看| av解说| 欧美国产一区二区| 日韩精品影视| av在线一区二区| 神马午夜三级| 在线观看高清无码| 中文字幕在线免费看线人| www.seses| 日韩综合精品中文字幕66| 在线亚洲AV| 国产精品国产精品国产专区不卡| 国产色悠悠| 影音先锋男人站| 在线免费观看成人视频| 男人的天堂2019| aaa精品| 欧美国产日韩在线| 国产精品V日韩精品V在线观看| 无码视频一区二区| 91亚洲精品视频在线| 高清无码一区| 日韩成人精品在线| 91精品91久久久中77777| 97人妻人人澡| 国产操b视频| 爱爱中文字幕| 久久精品禁一区二区三区四区五区| 人人色人人操人人干| 一级片黄色电影| 日本高清黄色视频| 91二区三区| 国产骚逼| 午夜蜜桃人妻一区二区| 黄色视频大全在线观看| 日韩免费高清| 久久99久久99精品免视看婷婷| 欧美黄网站在线观看| 久操久操| 91久久精品视频| 亚洲成人h| 日韩欧美一级| 久久久久无码| 欧美插菊花综合网| 精品國產一區二區三區久久蜜月| 在线免费A片| 欧美精品乱码99久久蜜桃| 国产激情免费视频| 五月婷婷在线播放| 黄色草逼视频| 午夜资源站| 黄色福利| 99热在线观看精品免费| 精品无码视频在线| 亚洲人成在线观看| 少妇高潮喷水视频| 二级黄色视频| 乱码中文字幕日韩欧美在线 | 国产青草视频在线观看| 天天综合久久| 日本内射网站| 中文字幕免费AV| 亚洲视频在线观看中文字幕| 操比视频| 久久亚洲婷婷| 男人天堂综合网| 亚洲精品18在线观看| 久草福利| 人妻大屁股-91Porn| 老太色HD色老太HD-百度| 婷婷色大师| 一区二区三区国产| 国产一级a毛一级a毛视频在线网站 | 四虎网站| 蜜桃毛片| 日韩欧美亚洲一区二区三区| 91丨露脸丨熟女精品| 丰滿老婦BBwBBwBBw| 一本色道久久综合狠狠躁的推荐| 想要xx视频| www.seses| 美日韩视频欧美一区二区视频| 久久性爱网| 天天干无码| 人人爽人人操人人爱| 欧美国产成人在线| 欧美精品久久久| 成人特级毛片| 奇米影视狠狠干| 一级黄色生活片| 免费肏屄| 91成人篇| 日韩视频在线播放| 青青草原网| 色吟AV| 国产aa片| 一区二区无码av| 特级丰满少妇免费观看| 午夜国产在线观看| 亚洲精品成人在线| 久久久成人片| 亚洲国产无码在线观看| 成人午夜啪免费视频在线观看软件 | 无码精品一区二区三区在线播放| 无码一区二区三区四区五区| 欧美成人h| 欧美丰满人妻| 欧美成人免费A级在线观看| 国精品无码人妻一区二区三区| 韩日午夜| 日韩三级在线免费观看| 欧美三级在线| 久久免费精品| 国产精品成人无码免费| 日本不卡中文字幕| 天天爽夜夜爽人人爽| 青青草91视频| 一二三四区视频| 国产成人精品777777| 操逼网址大全| 扒开让我91看片在线看| 国产精品一区二区AV日韩在线| 国产一区二区精品| 中文字幕一区二区三区的重点问题| 丁香五月婷婷网| 91人妻人人澡人人爽人人精| 日韩欧美精品| 欧美三级片网| 久草免费在线观看视频| 99操逼网| 五月天婷婷成人| 欧美日韩国产成人电影| 仓井空一区二区三区| 亚洲黄色在线免费观看| 日本親子亂子倫XXXX| 国产精品一级无码免费播放| 日韩性AV| 麻豆一区视频| 欧美日韩中字| 一级a片在线免费观看| 操干视频| 日韩一区二区AV| 成人国产| 亚洲AV无码日韩AV无码导航| 农村一级婬片A片| 亚洲无码三级片在线观看| 中国免费看片| 蜜臀av一区二区三区| 91香蕉在线观看视频在线播放 | 九九九成人视频| 网络自拍亚洲激情| 在线一级A片| 亚洲无码电影视频| 欧美A片免费观看| 69堂在线观看| 亚洲色人妻| 中国操逼电影| 日韩无码视频一区二区| 人妻夜夜爽天天爽| 一本色道久久无码人妻精品69 | 码人妻免费视频| 欧美成人精品在线观看| 无码囯无精品毛片大码| 少妇黄色视频| 中文字幕一区二区三区四虎在线 | 久久草在线播放| 亚洲AV无一区二区三区久久| 97人妻精品一区二区三区视频| 青草无码视频| 亚洲黄片免费看| 特级WWW444至码| 97伊人| 青青操成人| 六月婷婷五月天| 最新国产毛片| 91白丝在线观看| 欧美在线日韩在线| 玖玖资源在线观看| 国产成人在线视频免费| 91porn在线观看| 精品人妻午夜| 哪里能看毛片| 国产天堂网| 四季AV一区二区夜夜嗨| 国产精品视频免费在线观看| а天堂中文在线资源| 一级片欧美| 亚洲天堂无码在线观看| 五月婷婷综合在线| 在线无码中文字幕| 国产乱人伦无码视频| 日韩高清无码毛片| 久久91欧美特黄A片| 东北毛片| 日韩女人性爱| 91久久久久久久久久久| 国产av综合网| 日韩激情一区| 日本精品无码a62v在线| 操B视频在线观看| 亚州精品无码| 日本少妇久久| 91久久人澡人妻人人澡人人爽| 蜜臀网| 一级黄色电影免费观看| 丁香五月激情网| 久操| 国产美女操逼网站| 国产女人十八水真多| 神马午夜福利影院| 国产一区二区三区免费视频| 欧美口爆| 日韩和的一区二区| 日韩v片| 无码中文字幕在线视频| 国产高清一区二区三区| 亚洲色图15p| 久久午夜成人电影| 韩国三级片在线| 国产成人精品二三区麻豆| 伊人网综合| 欧美性爱日韩| 国产足交视频| 亚洲天堂男人| 日无码| 日韩AV手机在线观看| 熟女人妻在线观看| 91精品视频在线播放| 2025最新偷拍| 加勒比无码视频| 精品人妻午夜一区二区三区四区| 天天色色| 五月天狠狠| 成人久久久久一级大黄毛片中国| 日本免费黄色片| 欧美国产日韩综合在线观看170 | 日韩欧美高清视频| 天天搞天天色| 91热爆在线| 91人人在线| 一级欧美一级日韩| 午夜精品一区二区三区在线成人| 亚洲婷婷五月天| 良妇露脸15P| 中文字幕人妻精品一区| 日韩中文字幕国产| 欧美一区二区三区成人片下载| 操人妻视频| 亚洲无码一区二区在线| 亚洲香蕉在线视频| 国产精品123区| 成人AV午夜福利| 亚洲免费播放| 艹逼中文字幕| 国产黄色一级| 国产黄色AV| 风间由美大荫蒂无码AV| 操碰视频在线| 久久国产精| 国产免费一区二区| 亚洲伊人大香蕉| 日韩黄色电影| 亚洲成人视频免费在线观看| 手机看片福利永久| 91av免费在线观看| 91亚洲精品久久久久蜜桃| 丝瓜污视频| 天天日天天撸| 日韩激情视频| 东方av在线播放| 欧美91| 另类老妇奶性生BBwBBw偷拍 | 欧美VA| 伊人久久AV诱惑悠悠| 午夜爱爱爱| a片在线观看免费| 中文字幕乱码中文字幕| 91视频网站| 69国产成人精品二区| 久久久成人免费电影| AV黄色| 六月婷婷深爱| 色av网| 成人午夜福利视频| 中文字幕在线免费| 性爱视频久久| 精品国产乱码久久久久久郑州公司| 一道本视频在线| 插插插菊花综合网| 欧美成人性爱网| 青青久久91| 日韩1页| 超碰天天射| 亚洲精品色| 婷婷免费| 一级A片免费| 国产欧美高清在线| 操逼中文字幕| 亚洲AVwww| 麻豆乱伦视频| 尤物免费视频| 五月天深爱激情网| 亚洲视频久久| 亚洲天堂AV2025| 久久精品视频99| 按摩性高湖婬AAA片A片中国| x88AV吊钟奶熟女| 免费福利在线视频| 国产精品国产三级国产专业不| 爱视频福利网| 欧美色色色色色| 国产精品一区二区黑人巨大| 操b视频在线观看| 日本天堂网站| 亚洲无码精品在线| 亚洲无码在线精品| 狠狠干狠狠草| 波多野结衣av在线观看| 人人操超碰| 日韩成人免费在线| 搞搞视频| 国产精品久久毛片| 久久三级| 中文字幕高清无码在线| 特级西西| 亚洲影音先锋| 乱子伦国产精品一区二区| 无码高清视频在线观看| 午夜乱伦| 一级A爱爱| 午夜无码影院| 艹逼网站| 99视频在线| 午夜无码高清| 综合色综合| 亚洲精品另类| 91人妻无码成人精品一区二区| 免费在线观看内射| 成人无码在线观看免费视频| 成人AV中文字幕| free性欧美| 欧美日韩国产高清| 东方AV在| 成人AV电影在线观看| 福利导航在线| 黄色操逼片| 日本操骚逼| 黃色级A片一級片| A级黄色毛片| 亚洲AV无码国产精品| 午夜蜜桃| 免费v在线观看| 中文无码在线播放| 俺来也在线视频| 成人午夜小电影| 一区毛片| 欧美一级视频在线观看| 亚洲天堂网2025| www.bbbb| 欧美成人免费电影| 日韩第一色| 丁香六月婷婷| 少妇超碰| 免费黄色成人| 欧美美女日逼视频| 东北女人操逼| 成人福利在线观看| 韩日成人| 中文字幕婷婷| 你懂的在线网站| 美女A级毛片| 亚洲综合免费| 热无码| 国产黄色性爱视频| 中文字幕日韩AV| 亚洲无码视频在线观看高清 | 国产精品一区二区在线播放| 高清色色女网站| 亚洲成人小说| 亚洲免费观看高清完整版| 91丨国产丨白丝| 蜜臀AⅤ在线| 亚洲一二三四| 欧美日色| 国内视频一区| 亚洲中文字幕播放| 东京热精品| 中国老女人操逼视频| 亚洲精品伦理| 99视频免费在线| 免费在线观看黄片| 99re热| 加勒比无码在线播放| 97超碰中文字幕| 噜噜色av| 91一区二区| 黄色成人在线视频| 成人激情综合| 一本色道久久无码人妻精品69| 操日韩美女| 国产曰韩欧美综合另类在线| 五月天黄色小说| 中文字幕在线视频免费观看| 亚洲人成电影网| 黄色视频A片| 亚洲无码三级片在线观看| 无码熟妇| 人妻日韩| 日韩午夜AV| 性无码一区二区三区在线观看| 欧美级黑寡妇毛片app| 裸体黄色一极大片| 蜜桃精品一区二区三区美女| 欧美大香蕉网| 777免费视频| 网站毛片| 国产成人亚洲综合AV婷婷| 99热这里是精品| 东京热观看| 三级片在线观看网站| 中文有码| 精品91| 精品一区二区视频| 91小视频| 亚洲成人大香蕉| 亚洲国产无码在线观看| 国产视频高清无码| 无码av高清| 九月婷婷综合| 国产一级免费观看| 麻豆91网站| 国产黄色电影| 色天堂在线观看| 欧美亚韩一区二区三区| 熟女人妻人妻HD| 免费的操逼视频| 先锋影音资源网站| 亚洲一区二区三区视频| 91大香蕉视频| 99久热在线精品视频| 日韩色逼| 日韩a在线观看| 午夜精品久久久久久久91蜜桃| 伊人视频网| 69激情网| www.欧美精品| 豆花视频一区| 91精品国产一区二区三区四区大| 国产91综合一区在线观看| 午夜福利2025| 日韩欧美综合一区| 国产A片精品| 午夜成人福利视频在线观看| 日本高清一区二区高清免费视频| 日韩精品在线观看视频| 亚洲日韩在线视频| 一道本在线| 人妻人人操| 91一区| 中文字幕在线看| 一级操逼视频| 黄片视频免费| 色婷婷av| 欧美成人视频。| 久久99精品久久久久婷婷| 青青草无码在线视频| 欧美A视频在线观看| XXXX操| 日本伊人网| 5252a我爱haose01我愿| AA免费视频| 色五月亚洲| 高清无码直接看| 北条麻妃99精品青青久久| www.99在线| 国产噜噜噜噜久久久久久久久| 久操av在线| 国产一区二区三区在线观看免费视频免费视频免费视频 | 色色五月丁香| 最新免费一区二区三区| 人妻天天爽夜夜爽| 91麻豆精品视频| 蜜桃视频一区二区三区四区使用方法 | 国精产品秘一区二区| 亚洲人视频| 91最新视频| 青青草原免费在线视频| 亚洲vs无码秘蜜桃| 国产操b视频| 九九热国产视频| 日韩免费无码视频| 天天插天天插| 日韩一级无码| 黄片高清免费观看| 青娱乐A片| 亚洲秘无码一区二区三区电影| 黄色成人视频免费看| 中文无码字幕在线| 国产又爽又黄在线看| 欧美精品综合| 91超碰在线观看| 国产一级特黄aaa大片| 色五月亚洲| 超碰一区二区三区| 免费A在线观看| 懂色av粉嫩av蜜臀av| 91在线导航| 蜜桃传媒一区二区| 无码电影视频| 精品无码AV一区二区三区| 精品乱子伦| 最新av| 久久久久网站| 看国产AA免费| 欧美黄片无码| 欧美精品乱码99久久蜜桃| 亚洲性天堂| 久久综合九九| 操干视频| 很很撸在线视频| 大香蕉熟女| 性久久久久久久久久| 热re99久久精品国产99热| 中文观看| 青青草免费观看视频| 日韩高清一区二区| 天天爽夜夜爽| 日本大香蕉在线视频| 老熟女伦一区二区三区| 久久AV秘一区二区三区水生| 日韩久久精品| 日本一级婬片A片免费看| 丁香婷婷在线| 亚洲日韩欧美一区二区天天天| 黄色成人在线免费观看| 国产精品电影大全| 山东乱子伦视频国产| 成人免费黄色片| 免费视频91蜜桃| 久久国产精品视频| 午夜爱爱免费视频| 成人电影久久久| 精品国产91| 91羞射短视频在线观看| 日韩一级片在线| 四季AV一区二区夜夜嗨| 手机AV在线| 国产熟妇搡BBBB搡BBBB搡| 国产成人精品av在线观看| 亚洲青草| 麻豆91免费视频| 在线www| 国产精品久久久久久亚洲影视| 黄片av| 亚洲福利在线免费观看| 免费看一级黄色片| 国精产品乱码一区一区三区四区| 怡红院成人AV| 国产不卡在线观看| 超碰免费在线观看| 青草久操| 黄片在线免费播放| 91在线无码精品秘国产三年 | 国产免费av在线| 伊人88| 看一级黄色毛片| 一区二区三区四区av| 免费三级网站| 久久伊人中文字幕| 人成无码| 学生妹一级J人片内射视频| 国产性精品| 欧美囗交大荫蒂免费| 中文字幕在线一区| 天天干天天日天天干天天日| 蜜臀av网| 91亚洲国产AⅤ精品一区二区| 99视频在线免费观看| 91欧美精品成人AAA片| 这里只有精品久久| 国产123区| 性欧美丰满熟妇XXXX性久久久 | 久久天堂网| 日韩成人无码影片| 91视频国产精品| mm131亚洲国产精品久久| 色香蕉网| 午夜影音| 青春草在线免费观看| eeuss一区二区| 黄色视频在线免费看| 黄色国产网站| 日韩福利在线观看| 国产超级无码高清在线视频观看| 91免费高清视频| 久久久久久无码日韩欧美电影| 日韩精品丰满无码一级A片∴ | 西西444WWW无码精品| 日本精品视频| 91丨九色丨熟女泻火| 狼友视频在线| 大香蕉伊人视频在线观看| 99视频精品在线| 人人操天天干| 青青艹在线视频| 粉嫩小泬BBBB免费看| 大陆一级片| 色婷婷激情五月天| 日韩成人网站在线观看| 色婷婷av| 亚洲AV播放| 色色天堂成人电影| 麻豆AV在线播放| 日韩人妻无码一区二区三区七区| 亚洲一区二区无码| 1000部毛片A片免费视频| 国产又爽又黄免费网站校园里 | 欧美成人视频大全| 日本中文在线观看| 欧美色图视频网站| 天天干天| 男人的天堂av网站| 五月天激情综合网| 免费无码成人| 黄片日逼| 国产免费一区二区三区免费视频 | 特级毛片AAAAAA蜜桃| 蜜臀av在线观看| 黑人中文字幕| 日本黄在线观看| xxxx日韩| 国产AV一级片| 高清无码免费观看视频| 亚洲在线免费| 精品视频在线观看免费| 欧美国产日韩综合在线观看170 | 欧美一级生活片| 国产精品成人无码免费| 人与禽一级A片一区二区三区| 欧美一级A片高清免费播放| 日B视频在线观看| 国产狂喷水潮免费网站www| 成人黄色av| 亚洲色男人天堂| 欧美日韩性| 日本暖暖视频| 成人大香蕉| 成人毛片100免费观看| 天堂视频中文在线| 亚洲成人网站在线| 五月天一区二区三区| 美妇肥臀一区二区三区-久久99精品国| 欧美视频a| 午夜无码免费| 色99999| 四虎操逼| 国产精品视频瘾无码| 97自拍视频| 中文字幕av一区| 亚洲AV五月天在线| 中日韩在线视频| 精品欧美成人片在线| 亚洲无码在线观看视频| 国产玖玖| 国产SM视频| 欧美色色网| 亚洲字幕无码| 日韩中文无码电影| 91在线无码精品秘国产三年 | 撸一撸在线视频| 大香蕉天天操| 日韩精品成人AV| 大鸡巴久久| 国产操逼图| A视频免费在线观看| JUY-579被丈夫的上司侵犯后的第7天,我| 久久黄色的| 92自拍视频| 99在线精品视频| 91麻豆精品91久久久ios版| 屁屁影院CCYYCOM国产| 美女视频一区二区三区| 思思热99| 亚洲精品久久久久久久久蜜桃| 亚洲色婷婷五月| 日韩人妻中文字幕| 午夜精品电影| 亚洲精品女人| 一级无码A片| 天堂免费视频| 国产在线观看免费| 亚洲视频在线观看网站| 在线看片a| 天天插天天射| 人人操人人摸人人爽| 少妇BBBBBB| 国产精品无码永久免费不卡| 中文字幕区| 亚洲人妻免费视频| 在线无码免费观看| 亚洲激情五月| 五月天无码免费视频| 久久久久久无码日韩欧美电影| 成人无码一区二区| 亚洲日本黄色视频| 操逼视频电影| 国产乱伦视屏| S28AV| 无码三级在线观看| 91人妻网| 国产精品无码中文在线| 日日摸日日添日日躁AV| 手机免费Av| 偷拍99| www.国产在线观看| 91麻豆福利视频| 北条麻妃一区二区三区在线播放| 成人性生交片无码免费看人 | 亚洲AV毛片| 爽妇综合网| 色婷婷在线影院| 亚洲色图欧美在线| 96精品久久久久久久久久| 91大神免费在线观看| 国内精品一区二区| 在线观看日本vs欧洲vs美洲| 人妻丰满熟妇av无码区| 久久久久久久免费| 婷婷五月成人| 国产精品国产三级国产| 东方AV免费在线观看| 北条麻妃电影九九九| 国产你懂的| 热99精品| 久久久久无码精品亚洲日韩| 日本a在线观看| 久久久夜夜夜| 无码入口| 欧美亚洲成人在线观看| 人妻18无码人伦一区二区三区精品 | 天天插天天| 日韩免费福利视频| 大香蕉现在视频中心一| 欧美A∨| 国产免费黄色电影| 老司机免费福利视频| 黄色视频网站在线观看免费| 蜜桃精品视频在线观看| 婷婷综合久久| aⅴ在线| 五月婷在线观看| 在线亚洲AV| 97超碰资源站| 人妻夜夜爽天天爽| 无码波多野结衣| 国产内射久久| 人人爽人人爽人人| 日韩三区在线| 91av免费看| 韩日综合在线| 成年片免费观看网站免费观看,亚洲+欧...| 亚欧综合在线| 黄页免费无码| 欧美足交视频|