日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

关于指针,可能是网上最详细的讲解了

發布時間:2023/12/18 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于指针,可能是网上最详细的讲解了 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
指針是C語言中廣泛使用的一種數據類型。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數據結構; 能很方便地使用數組和字符串; 并能象匯編語言一樣處理內存地址,從而編出精練而高效的程序。指針極大地豐富了C語言的功能。 學習指針是學習C語言中最重要的一環, 能否正確理解和使用指針是我們是否掌握C語言的一個標志。同時, 指針也是C語言中最為困難的一部分,在學習中除了要正確理解基本概念,還必須要多編程,上機調試。只要作到這些,指針也是不難掌握的。

  指針的基本概念 在計算機中,所有的數據都是存放在存儲器中的。 一般把存儲器中的一個字節稱為一個內存單元, 不同的數據類型所占用的內存單元數不等,如整型量占2個單元,字符量占1個單元等, 在第二章中已有詳細的介紹。為了正確地訪問這些內存單元, 必須為每個內存單元編上號。 根據一個內存單元的編號即可準確地找到該內存單元。內存單元的編號也叫做地址。 既然根據內存單元的編號或地址就可以找到所需的內存單元,所以通常也把這個地址稱為指針。 內存單元的指針和內存單元的內容是兩個不同的概念。 可以用一個通俗的例子來說明它們之間的關系。我們到銀行去存取款時, 銀行工作人員將根據我們的帳號去找我們的存款單, 找到之后在存單上寫入存款、取款的金額。在這里,帳號就是存單的指針, 存款數是存單的內容。對于一個內存單元來說,單元的地址即為指針, 其中存放的數據才是該單元的內容。在C語言中, 允許用一個變量來存放指針,這種變量稱為指針變量。因此, 一個指針變量的值就是某個內存單元的地址或稱為某內存單元的指針。圖中,設有字符變量C,其內容為“K”(ASCII碼為十進制數 75),C占用了011A號單元(地址用十六進數表示)。設有指針變量P,內容為011A, 這種情況我們稱為P指向變量C,或說P是指向變量C的指針。 嚴格地說,一個指針是一個地址, 是一個常量。而一個指針變量卻可以被賦予不同的指針值,是變。 但在常把指針變量簡稱為指針。為了避免混淆,我們中約定:“指針”是指地址, 是常量,“指針變量”是指取值為地址的變量。 定義指針的目的是為了通過指針去訪問內存單元。
 ?
   既然指針變量的值是一個地址, 那么這個地址不僅可以是變量的地址, 也可以是其它數據結構的地址。在一個指針變量中存放一
個數組或一個函數的首地址有何意義呢? 因為數組或函數都是連續存放的。通過訪問指針變量取得了數組或函數的首地址, 也就找到了該數組或函數。這樣一來, 凡是出現數組,函數的地方都可以用一個指針變量來表示, 只要該指針變量中賦予數組或函數的首地址即可。這樣做, 將會使程序的概念十分清楚,程序本身也精練,高效。在C語言中, 一種數據類型或數據結構往往都占有一組連續的內存單元。 用“地址”這個概念并不能很好地描述一種數據類型或數據結構, 而“指針”雖然實際上也是一個地址,但它卻是一個數據結構的首地址, 它是“指向”一個數據結構的,因而概念更為清楚,表示更為明確。 這也是引入“指針”概念的一個重要原因。

指針變量的類型說明

  對指針變量的類型說明包括三個內容:
(1)指針類型說明,即定義變量為一個指針變量;
(2)指針變量名;
(3)變量值(指針)所指向的變量的數據類型。
   其一般形式為: 類型說明符 *變量名;
   其中,*表示這是一個指針變量,變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數據類型。
   例如: int *p1;表示p1是一個指針變量,它的值是某個整型變量的地址。 或者說p1指向一個整型變量。至于p1究竟指向哪一個整型變量, 應由向p1賦予的地址來決定。
   再如:
staic int *p2; /*p2是指向靜態整型變量的指針變量*/
float *p3; /*p3是指向浮點變量的指針變量*/
char *p4; /*p4是指向字符變量的指針變量*/ 應該注意的是,一個指針變量只能指向同類型的變量,如P3 只能指向浮點變量,不能時而指向一個浮點變量, 時而又指向一個字符變量。

指針變量的賦值

  指針變量同普通變量一樣,使用之前不僅要定義說明, 而且必須賦予具體的值。未經賦值的指針變量不能使用, 否則將造成系統混亂,甚至死機。指針變量的賦值只能賦予地址, 決不能賦予任何其它數據,否則將引起錯誤。在C語言中, 變量的地址是由編譯系統分配的,對用戶完全透明,用戶不知道變量的具體地址。 C語言中提供了地址運算符&來表示變量的地址。其一般形式為: & 變量名; 如&a變示變量a的地址,&b表示變量b的地址。 變量本身必須預先說明。設有指向整型變量的指針變量p,如要把整型變量a 的地址賦予p可以有以下兩種方式:
(1)指針變量初始化的方法 int a;
int *p=&a;
(2)賦值語句的方法 int a;
int *p;
p=&a;
不允許把一個數賦予指針變量,故下面的賦值是錯誤的: int *p;p=1000; 被賦值的指針變量前不能再加“*”說明符,如寫為*p=&a 也是錯誤的

指針變量的運算

  指針變量可以進行某些運算,但其運算的種類是有限的。 它只能進行賦值運算和部分算術運算及關系運算。
1.指針運算符

(1)取地址運算符&
   取地址運算符&是單目運算符,其結合性為自右至左,其功能是取變量的地址。在scanf函數及前面介紹指針變量賦值中,我們已經了解并使用了&運算符。

(2)取內容運算符*
   取內容運算符*是單目運算符,其結合性為自右至左,用來表示指針變量所指的變量。在*運算符之后跟的變量必須是指針變量。需要注意的是指針運算符*和指針變量說明中的指針說明符* 不是一回事。在指針變量說明中,“*”是類型說明符,表示其后的變量是指針類型。而表達式中出現的“*”則是一個運算符用以表示指針變量所指的變量。
main(){
int a=5,*p=&a;
printf ("%d",*p);
}
......
表示指針變量p取得了整型變量a的地址。本語句表示輸出變量a的值。

2.指針變量的運算

(1)賦值運算

指針變量的賦值運算有以下幾種形式:
①指針變量初始化賦值,前面已作介紹。

②把一個變量的地址賦予指向相同數據類型的指針變量。例如:
int a,*pa;
pa=&a; /*把整型變量a的地址賦予整型指針變量pa*/

③把一個指針變量的值賦予指向相同類型變量的另一個指針變量。如:
int a,*pa=&a,*pb;
pb=pa; /*把a的地址賦予指針變量pb*/
由于pa,pb均為指向整型變量的指針變量,因此可以相互賦值。 ④把數組的首地址賦予指向數組的指針變量。
例如: int a[5],*pa;
pa=a; (數組名表示數組的首地址,故可賦予指向數組的指針變量pa)
也可寫為:
pa=&a[0]; /*數組第一個元素的地址也是整個數組的首地址,
也可賦予pa*/
當然也可采取初始化賦值的方法:
int a[5],*pa=a;

⑤把字符串的首地址賦予指向字符類型的指針變量。例如: char *pc;pc="c language";或用初始化賦值的方法寫為: char *pc="C Language"; 這里應說明的是并不是把整個字符串裝入指針變量, 而是把存放該字符串的字符數組的首地址裝入指針變量。 在后面還將詳細介紹。

⑥把函數的入口地址賦予指向函數的指針變量。例如: int (*pf)();pf=f; /*f為函數名*/

(2)加減算術運算

  對于指向數組的指針變量,可以加上或減去一個整數n。設pa是指向數組a的指針變量,則pa+n,pa-n,pa++,++pa,pa--,--pa 運算都是合法的。指針變量加或減一個整數n的意義是把指針指向的當前位置(指向某數組元素)向前或向后移動n個位置。應該注意,數組指針變量向前或向后移動一個位置和地址加1或減1 在概念上是不同的。因為數組可以有不同的類型, 各種類型的數組元素所占的字節長度是不同的。如指針變量加1,即向后移動1 個位置表示指針變量指向下一個數據元素的首地址。而不是在原地址基礎上加1。
例如:
int a[5],*pa;
pa=a; /*pa指向數組a,也是指向a[0]*/
pa=pa+2; /*pa指向a[2],即pa的值為&pa[2]*/ 指針變量的加減運算只能對數組指針變量進行, 對指向其它類型變量的指針變量作加減運算是毫無意義的。(3)兩個指針變量之間的運算只有指向同一數組的兩個指針變量之間才能進行運算, 否則運算毫無意義。

①兩指針變量相減
兩指針變量相減所得之差是兩個指針所指數組元素之間相差的元素個數。實際上是兩個指針值(地址) 相減之差再除以該數組元素的長度(字節數)。例如pf1和pf2 是指向同一浮點數組的兩個指針變量,設pf1的值為2010H,pf2的值為2000H,而浮點數組每個元素占4個字節,所以pf1-pf2的結果為(2000H-2010H)/4=4,表示pf1和 pf2之間相差4個元素。兩個指針變量不能進行加法運算。 例如, pf1+pf2是什么意思呢?毫無實際意義。

②兩指針變量進行關系運算
指向同一數組的兩指針變量進行關系運算可表示它們所指數組元素之間的關系。例如:
pf1==pf2表示pf1和pf2指向同一數組元素
pf1>pf2表示pf1處于高地址位置
pf1<pf2表示pf2處于低地址位置
main(){
int a=10,b=20,s,t,*pa,*pb;
pa=&a;
pb=&b;
s=*pa+*pb;
t=*pa**pb;
printf("a=%d/nb=%d/na+b=%d/na*b=%d/n",a,b,a+b,a*b);
printf("s=%d/nt=%d/n",s,t);
}
......
說明pa,pb為整型指針變量
給指針變量pa賦值,pa指向變量a。
給指針變量pb賦值,pb指向變量b。
本行的意義是求a+b之和,(*pa就是a,*pb就是b)。
本行是求a*b之積。
輸出結果。
輸出結果。
......
指針變量還可以與0比較。設p為指針變量,則p==0表明p是空指針,它不指向任何變量;p!=0表示p不是空指針。空指針是由對指針變量賦予0值而得到的。例如: #define NULL 0 int *p=NULL; 對指針變量賦0值和不賦值是不同的。指針變量未賦值時,可以是任意值,是不能使用的。否則將造成意外錯誤。而指針變量賦0值后,則可以使用,只是它不指向具體的變量而已。
main(){
int a,b,c,*pmax,*pmin;
printf("input three numbers:/n");
scanf("%d%d%d",&a,&b,&c);
if(a>b){
pmax=&a;
pmin=&b;}
else{
pmax=&b;
pmin=&a;}
if(c>*pmax) pmax=&c;
if(c<*pmin) pmin=&c;
printf("max=%d/nmin=%d/n",*pmax,*pmin);
}
......
pmax,pmin為整型指針變量。
輸入提示。
輸入三個數字。
如果第一個數字大于第二個數字...
指針變量賦值
指針變量賦值

指針變量賦值
指針變量賦值
判斷并賦值
判斷并賦值
輸出結果
......

數組指針變量的說明和使用

  指向數組的指針變量稱為數組指針變量。 在討論數組指針變量的說明和使用之前,我們先明確幾個關系。
一個數組是由連續的一塊內存單元組成的。 數組名就是這塊連續內存單元的首地址。一個數組也是由各個數組元素(下標變量) 組成的。每個數組元素按其類型不同占有幾個連續的內存單元。 一個數組元素的首地址也是指它所占有的幾個內存單元的首地址。 一個指針變量既可以指向一個數組,也可以指向一個數組元素, 可把數組名或第一個元素的地址賦予它。如要使指針變量指向第i號元素可以把i元素的首地址賦予它或把數組名加i賦予它。

  設有實數組a,指向a的指針變量為pa,從圖6.3中我們可以看出有以下關系:
pa,a,&a[0]均指向同一單元,它們是數組a的首地址,也是0 號元素a[0]的首地址。pa+1,a+1,&a[1]均指向1號元素a[1]。類推可知a+i,a+i,&a[i]
指向i號元素a[i]。應該說明的是pa是變量,而a,&a[i]都是常量。在編程時應予以注意。
main(){
int a[5],i;
for(i=0;i<5;i++){
a[i]=i;
printf("a[%d]=%d/n",i,a[i]);
}
printf("/n");
}
主函數
定義一個整型數組和一個整型變量
循環語句
給數組賦值
打印每一個數組的值
......
輸出換行
......
數組指針變量說明的一般形式為:
類型說明符 * 指針變量名
   其中類型說明符表示所指數組的類型。 從一般形式可以看出指向數組的指針變量和指向普通變量的指針變量的說明是相同的。
引入指針變量后,就可以用兩種方法來訪問數組元素了。
   第一種方法為下標法,即用a[i]形式訪問數組元素。 在第四章中介紹數組時都是采用這種方法。
   第二種方法為指針法,即采用*(pa+i)形式,用間接訪問的方法來訪問數組元素。
main(){
int a[5],i,*pa;
pa=a;
for(i=0;i<5;i++){
*pa=i;
pa++;
}
pa=a;
for(i=0;i<5;i++){
printf("a[%d]=%d/n",i,*pa);
pa++;
}
}
主函數
定義整型數組和指針
將指針pa指向數組a
循環
將變量i的值賦給由指針pa指向的a[]的數組單元
將指針pa指向a[]的下一個單元
......
指針pa重新取得數組a的首地址
循環
用數組方式輸出數組a中的所有元素
將指針pa指向a[]的下一個單元
......
......
下面,另舉一例,該例與上例本意相同,但是實現方式不同。
main(){
int a[5],i,*pa=a;
for(i=0;i<5;){
*pa=i;
printf("a[%d]=%d/n",i++,*pa++);
}
}
主函數
定義整型數組和指針,并使指針指向數組a
循環
將變量i的值賦給由指針pa指向的a[]的數組單元
用指針輸出數組a中的所有元素,同時指針pa指向a[]的下一個單元
......
......

數組名和數組指針變量作函數參數

  在第五章中曾經介紹過用數組名作函數的實參和形參的問題。在學習指針變量之后就更容易理解這個問題了。 數組名就是數組的首地址,實參向形參傳送數組名實際上就是傳送數組的地址, 形參得到該地址后也指向同一數組。 這就好象同一件物品有兩個彼此不同的名稱一樣。同樣,指針變量的值也是地址, 數組指針變量的值即為數組的首地址,當然也可作為函數的參數使用。
float aver(float *pa);
main(){
float sco[5],av,*sp;
int i;
sp=sco;
printf("/ninput 5 scores:/n");
for(i=0;i<5;i++) scanf("%f",&sco[i]);
av=aver(sp);
printf("average score is %5.2f",av);
}
float aver(float *pa)
{
int i;
float av,s=0;
for(i=0;i<5;i++) s=s+*pa++;
av=s/5;
return av;
}

指向多維數組的指針變量

本小節以二維數組為例介紹多維數組的指針變量。

一、多維數組地址的表示方法
設有整型二維數組a[3][4]如下:
0 1 2 3
4 5 6 7
8 9 10 11
   設數組a的首地址為1000,各下標變量的首地址及其值如圖所示。在第四章中介紹過, C語言允許把一個二維數組分解為多個一維數組來處理。因此數組a可分解為三個一維數組,即a[0],a[1],a[2]。每一個一維數組又含有四個元素。例如a[0]數組,含有a[0][0],a[0][1],a[0][2],a[0][3]四個元素。 數組及數組元素的地址表示如下:a是二維數組名,也是二維數組0行的首地址,等于1000。a[0]是第一個一維數組的數組名和首地址,因此也為1000。*(a+0)或*a是與a[0]等效的, 它表示一維數組a[0]0 號元素的首地址。 也為1000。&a[0][0]是二維數組a的0行0列元素首地址,同樣是1000。因此,a,a[0],*(a+0),*a?amp;a[0][0]是相等的。同理,a+1是二維數組1行的首地址,等于1008。a[1]是第二個一維數組的數組名和首地址,因此也為1008。 &a[1][0]是二維數組a的1行0列元素地址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。 由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。 此外,&a[i]和a[i]也是等同的。因為在二維數組中不能把&a[i]理解為元素a[i]的地址,不存在元素a[i]。

  C語言規定,它是一種地址計算方法,表示數組a第i行首地址。由此,我們得出:a[i],&a[i],*(a+i)和a+i也都是等同的。另外,a[0]也
可以看成是a[0]+0是一維數組a[0]的0號元素的首地址, 而a[0]+1則是a[0]的1號元素首地址,由此可得出a[i]+j則是一維數組a[i]的j號元素首地址,它等于&a[i][j]。由a[i]=*(a+i)得a[i]+j=*(a+i)+j,由于*(a+i)+j是二維數組a的i行j列元素的首地址。該元素的值等于*(*(a+i)+j)。
[Explain]#define PF "%d,%d,%d,%d,%d,/n"
main(){
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
printf(PF,a,*a,a[0],&a[0],&a[0][0]);
printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);
printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);
printf("%d,%d/n",a[1]+1,*(a+1)+1);
printf("%d,%d/n",*(a[1]+1),*(*(a+1)+1));
}

二、多維數組的指針變量

  把二維數組a 分解為一維數組a[0],a[1],a[2]之后,設p為指向二維數組的指針變量。可定義為: int (*p)[4] 它表示p是一個指針變量,它指向二維數組a 或指向第一個一維數組a[0],其值等于a,a[0],或&a[0][0]等。而p+i則指向一維數組a[i]。從前面的分析可得出*(p+i)+j是二維數組i行j 列的元素的地址,而*(*(p+i)+j)則是i行j列元素的值。

  二維數組指針變量說明的一般形式為: 類型說明符 (*指針變量名)[長度] 其中“類型說明符”為所指數組的數據類型。“*”表示其后的變量是指針類型。 “長度”表示二維數組分解為多個一維數組時, 一維數組的長度,也就是二維數組的列數。應注意“(*指針變量名)”兩邊的括號不可少,如缺少括號則表示是指針數組(本章后面介紹),意義就完全不同了。
[Explain]main(){
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
int(*p)[4];
int i,j;
p=a;
for(i=0;i<3;i++)
for(j=0;j<4;j++) printf("%2d ",*(*(p+i)+j));
}
'Expain字符串指針變量的說明和使用字符串指針變量的定義說明與指向字符變量的指針變量說明是相同的。只能按對指針變量的賦值不同來區別。 對指向字符變量的指針變量應賦予該字符變量的地址。如: char c,*p=&c;表示p是一個指向字符變量c的指針變量。而: char *s="C Language";則表示s是一個指向字符串的指針變量。把字符串的首地址賦予s。
請看下面一例。
main(){
char *ps;
ps="C Language";
printf("%s",ps);
}
運行結果為:
C Language
上例中,首先定義ps是一個字符指針變量, 然后把字符串的首地址賦予ps(應寫出整個字符串,以便編譯系統把該串裝入連續的一塊內存單元),并把首地址送入ps。程序中的: char *ps;ps="C Language";等效于: char *ps="C Language";輸出字符串中n個字符后的所有字符。
main(){
char *ps="this is a book";
int n=10;
ps=ps+n;
printf("%s/n",ps);
}
運行結果為:
book 在程序中對ps初始化時,即把字符串首地址賦予ps,當ps= ps+10之后,ps指向字符“b”,因此輸出為"book"。
main(){
char st[20],*ps;
int i;
printf("input a string:/n");
ps=st;
scanf("%s",ps);
for(i=0;ps[i]!='/0';i++)
if(ps[i]=='k'){
printf("there is a 'k' in the string/n");
break;
}
if(ps[i]=='/0') printf("There is no 'k' in the string/n");
}
   本例是在輸入的字符串中查找有無‘k’字符。 下面這個例子是將指針變量指向一個格式字符串,用在printf函數中,用于輸出二維數組的各種地址表示的值。但在printf語句中用指針變量PF代替了格式串。 這也是程序中常用的方法。
main(){
static int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
char *PF;
PF="%d,%d,%d,%d,%d/n";
printf(PF,a,*a,a[0],&a[0],&a[0][0]);
printf(PF,a+1,*(a+1),a[1],&a[1],&a[1][0]);
printf(PF,a+2,*(a+2),a[2],&a[2],&a[2][0]);
printf("%d,%d/n",a[1]+1,*(a+1)+1);
printf("%d,%d/n",*(a[1]+1),*(*(a+1)+1));
}
   在下例是講解,把字符串指針作為函數參數的使用。要求把一個字符串的內容復制到另一個字符串中,并且不能使用strcpy函數。函數cprstr的形參為兩個字符指針變量。pss指向源字符串,pds指向目標字符串。表達式:
(*pds=*pss)!=`/0'
cpystr(char *pss,char *pds){
while((*pds=*pss)!='/0'){
pds++;
pss++; }
}
main(){
char *pa="CHINA",b[10],*pb;
pb=b;
cpystr(pa,pb);
printf("string a=%s/nstring b=%s/n",pa,pb);
}
   在上例中,程序完成了兩項工作:一是把pss指向的源字符復制到pds所指向的目標字符中,二是判斷所復制的字符是否為`/0',若是則表明源字符串結束,不再循環。否則,pds和pss都加1,指向下一字符。在主函數中,以指針變量pa,pb為實參,分別取得確定值后調用cprstr函數。由于采用的指針變量pa和pss,pb和pds均指向同一字符串,因此在主函數和cprstr函數中均可使用這些字符串。也可以把cprstr函數簡化為以下形式:
cprstr(char *pss,char*pds)
{while ((*pds++=*pss++)!=`/0');}
   即把指針的移動和賦值合并在一個語句中。 進一步分析還可發現`/0'的ASCⅡ碼為0,對于while語句只看表達式的值為非0就循環,為0則結束循環,因此也可省去“!=`/0'”這一判斷部分,而寫為以下形式:
cprstr (char *pss,char *pds)
{while (*pdss++=*pss++);}
表達式的意義可解釋為,源字符向目標字符賦值, 移動指針,若所賦值為非0則循環,否則結束循環。這樣使程序更加簡潔。簡化后的程序如下所示。
cpystr(char *pss,char *pds){
while(*pds++=*pss++);
}
main(){
char *pa="CHINA",b[10],*pb;
pb=b;
cpystr(pa,pb);
printf("string a=%s/nstring b=%s/n",pa,pb);
}

使用字符串指針變量與字符數組的區別

用字符數組和字符指針變量都可實現字符串的存儲和運算。 但是兩者是有區別的。在使用時應注意以下幾個問題:

1. 字符串指針變量本身是一個變量,用于存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續的內存空間中并以‘/0’作為串的結束。字符數組是由于若干個數組元素組成的,它可用來存放整個字符串。

2. 對字符數組作初始化賦值,必須采用外部類型或靜態類型,如: static char st[]={“C Language”};而對字符串指針變量則無此限制,如: char *ps="C Language";

3. 對字符串指針方式 char *ps="C Language";可以寫為: char *ps; ps="C Language";而對數組方式:
static char st[]={"C Language"};
不能寫為:
char st[20];st={"C Language"};
而只能對字符數組的各元素逐個賦值。

  從以上幾點可以看出字符串指針變量與字符數組在使用時的區別,同時也可看出使用指針變量更加方便。前面說過,當一個指針變量在未取得確定地址前使用是危險的,容易引起錯誤。但是對指針變量直接賦值是可以的。因為C系統對指針變量賦值時要給以確定的地址。因此,
char *ps="C Langage";
或者 char *ps;
ps="C Language";都是合法的。

函數指針變量

  在C語言中規定,一個函數總是占用一段連續的內存區, 而函數名就是該函數所占內存區的首地址。 我們可以把函數的這個首地址(或稱入口地址)賦予一個指針變量, 使該指針變量指向該函數。然后通過指針變量就可以找到并調用這個函數。 我們把這種指向函數的指針變量稱為“函數指針變量”。
函數指針變量定義的一般形式為:
類型說明符 (*指針變量名)();
其中“類型說明符”表示被指函數的返回值的類型。“(* 指針變量名)”表示“*”后面的變量是定義的指針變量。 最后的空括號表示指針變量所指的是一個函數。
例如: int (*pf)();
表示pf是一個指向函數入口的指針變量,該函數的返回值(函數值)是整型。
下面通過例子來說明用指針形式實現對函數調用的方法。
int max(int a,int b){
if(a>b)return a;
else return b;
}
main(){
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:/n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
}
   從上述程序可以看出用,函數指針變量形式調用函數的步驟如下:1. 先定義函數指針變量,如后一程序中第9行 int (*pmax)();定義pmax為函數指針變量。

2. 把被調函數的入口地址(函數名)賦予該函數指針變量,如程序中第11行 pmax=max;

3. 用函數指針變量形式調用函數,如程序第14行 z=(*pmax)(x,y); 調用函數的一般形式為: (*指針變量名) (實參表)使用函數指針變量還應注意以下兩點:

a. 函數指針變量不能進行算術運算,這是與數組指針變量不同的。數組指針變量加減一個整數可使指針移動指向后面或前面的數組元素,而函數指針的移動是毫無意義的。

b. 函數調用中"(*指針變量名)"的兩邊的括號不可少,其中的*不應該理解為求值運算,在此處它只是一種表示符號。

指針型函數

前面我們介紹過,所謂函數類型是指函數返回值的類型。 在C語言中允許一個函數的返回值是一個指針(即地址), 這種返回指針值的函數稱為指針型函數。
定義指針型函數的一般形式為:
類型說明符 *函數名(形參表)
{
…… /*函數體*/
}
其中函數名之前加了“*”號表明這是一個指針型函數,即返回值是一個指針。類型說明符表示了返回的指針值所指向的數據類型。
如:
int *ap(int x,int y)
{
...... /*函數體*/
}
   表示ap是一個返回指針值的指針型函數, 它返回的指針指向一個整型變量。下例中定義了一個指針型函數 day_name,它的返回值指向一個字符串。該函數中定義了一個靜態指針數組name。name 數組初始化賦值為八個字符串,分別表示各個星期名及出錯提示。形參n表示與星期名所對應的整數。在主函數中, 把輸入的整數i作為實參, 在printf語句中調用day_name函數并把i值傳送給形參 n。day_name函數中的return語句包含一個條件表達式, n 值若大于7或小于1則把name[0] 指針返回主函數輸出出錯提示字符串“Illegal day”。否則返回主函數輸出對應的星期名。主函數中的第7行是個條件語句,其語義是,如輸入為負數(i<0)則中止程序運行退出程序。exit是一個庫函數,exit(1)表示發生錯誤后退出程序, exit(0)表示正常退出。

  應該特別注意的是函數指針變量和指針型函數這兩者在寫法和意義上的區別。如int(*p)()和int *p()是兩個完全不同的量。int(*p)()是一個變量說明,說明p 是一個指向函數入口的指針變量,該函數的返回值是整型量,(*p)的兩邊的括號不能少。int *p() 則不是變量說明而是函數說明,說明p是一個指針型函數,其返回值是一個指向整型量的指針,*p兩邊沒有括號。作為函數說明, 在括號內最好寫入形式參數,這樣便于與變量說明區別。 對于指針型函數定義,int *p()只是函數頭部分,一般還應該有函數體部分。
main(){
int i;
char *day_name(int n);
printf("input Day No:/n");
scanf("%d",&i);
if(i<0) exit(1);
printf("Day No:%2d-->%s/n",i,day_name(i));
}
char *day_name(int n){
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return((n<1||n>7) ? name[0] : name[n]);
}
   本程序是通過指針函數,輸入一個1~7之間的整數, 輸出對應的星期名。指針數組的說明與使用一個數組的元素值為指針則是指針數組。 指針數組是一組有序的指針的集合。 指針數組的所有元素都必須是具有相同存儲類型和指向相同數據類型的指針變量。
   指針數組說明的一般形式為: 類型說明符*數組名[數組長度]
   其中類型說明符為指針值所指向的變量的類型。例如: int *pa[3] 表示pa是一個指針數組,它有三個數組元素, 每個元素值都是一個指針,指向整型變量。通常可用一個指針數組來指向一個二維數組。 指針數組中的每個元素被賦予二維數組每一行的首地址, 因此也可理解為指向一個一維數組。圖6—6表示了這種關系。
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *pa[3]={a[0],a[1],a[2]};
int *p=a[0];
main(){
int i;
for(i=0;i<3;i++)
printf("%d,%d,%d/n",a[i][2-i],*a[i],*(*(a+i)+i));
for(i=0;i<3;i++)
printf("%d,%d,%d/n",*pa[i],p[i],*(p+i));
}
   本例程序中,pa是一個指針數組,三個元素分別指向二維數組a的各行。然后用循環語句輸出指定的數組元素。其中*a[i]表示i行0列元素值;*(*(a+i)+i)表示i行i列的元素值;*pa[i]表示i行0列元素值;由于p與a[0]相同,故p[i]表示0行i列的值;*(p+i)表示0行i列的值。讀者可仔細領會元素值的各種不同的表示方法。 應該注意指針數組和二維數組指針變量的區別。 這兩者雖然都可用來表示二維數組,但是其表示方法和意義是不同的。

  二維數組指針變量是單個的變量,其一般形式中"(*指針變量名)"兩邊的括號不可少。而指針數組類型表示的是多個指針( 一組有序指針)在一般形式中"*指針數組名"兩邊不能有括號。例如: int (*p)[3];表示一個指向二維數組的指針變量。該二維數組的列數為3或分解為一維數組的長度為3。 int *p[3] 表示p是一個指針數組,有三個下標變量p[0],p[1],p[2]均為指針變量。

  指針數組也常用來表示一組字符串, 這時指針數組的每個元素被賦予一個字符串的首地址。 指向字符串的指針數組的初始化更為簡單。例如在例6.20中即采用指針數組來表示一組字符串。 其初始化賦值為:
char *name[]={"Illagal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
   完成這個初始化賦值之后,name[0]即指向字符串"Illegal day",name[1]指?quot;Monday"......。

  指針數組也可以用作函數參數。在本例主函數中,定義了一個指針數組name,并對name 作了初始化賦值。其每個元素都指向一個字符串。然后又以name 作為實參調用指針型函數day name,在調用時把數組名 name 賦予形參變量name,輸入的整數i作為第二個實參賦予形參n。在day name函數中定義了兩個指針變量pp1和pp2,pp1被賦予name[0]的值(即*name),pp2被賦予name[n]的值即*(name+ n)。由條件表達式決定返回pp1或pp2指針給主函數中的指針變量ps。最后輸出i和ps的值。

指針數組作指針型函數的參數
main(){
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
char *ps;
int i;
char *day name(char *name[],int n);
printf("input Day No:/n");
scanf("%d",&i);
if(i<0) exit(1);
ps=day name(name,i);
printf("Day No:%2d-->%s/n",i,ps);
}
char *day name(char *name[],int n)
{
char *pp1,*pp2;
pp1=*name;
pp2=*(name+n);
return((n<1||n>7)? pp1:pp2);
}
下例要求輸入5個國名并按字母順序排列后輸出。在以前的例子中采用了普通的排序方法, 逐個比較之后交換字符串的位置。交換字符串的物理位置是通過字符串復制函數完成的。 反復的交換將使程序執行的速度很慢,同時由于各字符串(國名) 的長度不同,又增加了存儲管理的負擔。 用指針數組能很好地解決這些問題。把所有的字符串存放在一個數組中, 把這些字符數組的首地址放在一個指針數組中,當需要交換兩個字符串時, 只須交換指針數組相應兩元素的內容(地址)即可,而不必交換字符串本身。程序中定義了兩個函數,一個名為sort完成排序, 其形參為指
針數組name,即為待排序的各字符串數組的指針。形參n為字符串的個數。另一個函數名為print,用于排序后字符串的輸出,其形參與sort的形參相同。主函數main中,定義了指針數組name 并作了初始化賦值。然后分別調用sort函數和print函數完成排序和輸出。值得說明的是在sort函數中,對兩個字符串比較,采用了strcmp 函數,strcmp函數允許參與比較的串以指針方式出現。name[k]和name[ j]均為指針,因此是合法的。字符串比較后需要交換時, 只交換指針數組元素的值,而不交換具體的字符串, 這樣將大大減少時間的開銷,提高了運行效率。
現編程如下:
#include"string.h"
main(){
void sort(char *name[],int n);
void print(char *name[],int n);
static char *name[]={ "CHINA","AMERICA","AUSTRALIA",
"FRANCE","GERMAN"};
int n=5;
sort(name,n);
print(name,n);
}
void sort(char *name[],int n){
char *pt;
int i,j,k;
for(i=0;i<n-1;i++){
k=i;
for(j=i+1;j<n;j++)
if(strcmp(name[k],name[j])>0) k=j;
if(k!=i){
pt=name[i];
name[i]=name[k];
name[k]=pt;
}
}
}
void print(char *name[],int n){
int i;
for (i=0;i<n;i++) printf("%s/n",name[i]);
}

main函數的參數

  前面介紹的main函數都是不帶參數的。因此main 后的括號都是空括號。實際上,main函數可以帶參數,這個參數可以認為是 main函數的形式參數。C語言規定main函數的參數只能有兩個, 習慣上這兩個參數寫為argc和argv。因此,main函數的函數頭可寫為: main (argc,argv)C語言還規定argc(第一個形參)必須是整型變量,argv( 第二個形參)必須是指向字符串的指針數組。加上形參說明后,main函數的函數頭應寫為:
main (argc,argv)
int argv;
char *argv[];或寫成:
main (int argc,char *argv[])
   由于main函數不能被其它函數調用, 因此不可能在程序內部取得實際值。那么,在何處把實參值賦予main函數的形參呢? 實際上,main函數的參數值是從操作系統命令行上獲得的。當我們要運行一個可執行文件時,在DOS提示符下鍵入文件名,再輸入實際參數即可把這些實參傳送到main的形參中去。

  DOS提示符下命令行的一般形式為: C:/>可執行文件名 參數 參數……; 但是應該特別注意的是,main 的兩個形參和命令行中的參數在
位置上不是一一對應的。因為,main的形參只有二個,而命令行中的參數個數原則上未加限制。argc參數表示了命令行中參數的個數(注意:文件名本身也算一個參數),argc的值是在輸入命令行時由系統按實際參數的個數自動賦予的。例如有命令行為: C:/>E6 24 BASIC dbase FORTRAN由于文件名E6 24本身也算一個參數,所以共有4個參數,因此argc取得的值為4。argv參數是字符串指針數組,其各元素值為命令行中各字符串(參數均按字符串處理)的首地址。 指針數組的長度即為參數個數。數組元素初值由系統自動賦予。其表示如圖6.8所示:
main(int argc,char *argv){
while(argc-->1)
printf("%s/n",*++argv);
}
本例是顯示命令行中輸入的參數如果上例的可執行文件名為e24.exe,存放在A驅動器的盤內。
因此輸入的命令行為: C:/>a:e24 BASIC dBASE FORTRAN
則運行結果為:
BASIC
dBASE
FORTRAN
   該行共有4個參數,執行main時,argc的初值即為4。argv的4個元素分為4個字符串的首地址。執行while語句,每循環一次 argv值減1,當argv等于1時停止循環,共循環三次, 因此共可輸出三個參數。在printf函數中,由于打印項*++argv是先加1再打印, 故第一次打印的是argv[1]所指的字符串BASIC。第二、 三次循環分別打印后二個字符串。而參數e24是文件名,不必輸出。

  下例的命令行中有兩個參數,第二個參數20即為輸入的n值。在程序中*++argv的值為字符串“20”,然后用函數"atoi"把它換為整型作為while語句中的循環控制變量,輸出20個偶數。
#include"stdlib.h"
main(int argc,char*argv[]){
int a=0,n;
n=atoi(*++argv);
while(n--) printf("%d ",a++*2);
}
   本程序是從0開始輸出n個偶數。指向指針的指針變量如果一個指針變量存放的又是另一個指針變量的地址, 則稱這個指針變量為指向指針的指針變量。

  在前面已經介紹過,通過指針訪問變量稱為間接訪問, 簡稱間訪。由于指針變量直接指向變量,所以稱為單級間訪。 而如果通過指向指針的指針變量來訪問變量則構成了二級或多級間訪。在C語言程序中,對間訪的級數并未明確限制, 但是間訪級數太多時不容易理解解,也容易出錯,因此,一般很少超過二級間訪。 指向指針的指針變量說明的一般形式為:
類型說明符** 指針變量名;
例如: int ** pp; 表示pp是一個指針變量,它指向另一個指針變量, 而這個指針變量指向一個整型量。下面舉一個例子來說明這種關系。
main(){
int x,*p,**pp;
x=10;
p=&x;
pp=&p;
printf("x=%d/n",**pp);
}
   上例程序中p 是一個指針變量,指向整型量x;pp也是一個指針變量, 它指向指針變量p。通過pp變量訪問x的寫法是**pp。程序最后輸出x的值為10。通過上例,讀者可以學習指向指針的指針變量的說明和使用方法。

  下述程序中首先定義說明了指針數組ps并作了初始化賦值。 又說明了pps是一個指向指針的指針變量。在5次循環中, pps 分別取得了ps[0],ps[1],ps[2],ps[3],ps[4]的地址值(如圖6.10所示)。再通過這些地址即可找到該字符串。
main(){
static char *ps[]={ "BASIC","DBASE","C","FORTRAN",
"PASCAL"};
char **pps;
int i;
for(i=0;i<5;i++){
pps=ps+i;
printf("%s/n",*pps);
}
}
本程序是用指向指針的指針變量編程,輸出多個字符串。

本章小結
1. 指針是C語言中一個重要的組成部分,使用指針編程有以下優點:
(1)提高程序的編譯效率和執行速度。
(2)通過指針可使用主調函數和被調函數之間共享變量或數據結構,便于實現雙向數據通訊。
(3)可以實現動態的存儲分配。
(4)便于表示各種數據結構,編寫高質量的程序。

2. 指針的運算
(1)取地址運算符&:求變量的地址
(2)取內容運算符*:表示指針所指的變量
(3)賦值運算
·把變量地址賦予指針變量
·同類型指針變量相互賦值
·把數組,字符串的首地址賦予指針變量
·把函數入口地址賦予指針變量
(4)加減運算
對指向數組,字符串的指針變量可以進行加減運算,如p+n,p-n,p++,p--等。對指向同一數組的兩個指針變量可以相減。對指向其它類型的指針變量作加減運算是無意義的。
(5)關系運算
指向同一數組的兩個指針變量之間可以進行大于、小于、 等于比較運算。指針可與0比較,p==0表示p為空指針。

3. 與指針有關的各種說明和意義見下表。
int *p;     p為指向整型量的指針變量
int *p[n];   p為指針數組,由n個指向整型量的指針元素組成。
int (*p)[n];  p為指向整型二維數組的指針變量,二維數組的列數為n
int *p()    p為返回指針值的函數,該指針指向整型量
int (*p)()   p為指向函數的指針,該函數返回整型量
int **p     p為一個指向另一指針的指針變量,該指針指向一個整型量。

4. 有關指針的說明很多是由指針,數組,函數說明組合而成的。
但并不是可以任意組合,例如數組不能由函數組成,即數組元素不能是一個函數;函數也不能返回一個數組或返回另一個函數。例如
int a[5]();就是錯誤的。

5. 關于括號
在解釋組合說明符時, 標識符右邊的方括號和圓括號優先于標識符左邊的“*”號,而方括號和圓括號以相同的優先級從左到右結合。但可以用圓括號改變約定的結合順序。

6. 閱讀組合說明符的規則是“從里向外”。
從標識符開始,先看它右邊有無方括號或園括號,如有則先作出解釋,再看左邊有無*號。 如果在任何時候遇到了閉括號,則在繼續之前必須用相同的規則處理括號內的內容。例如:
int*(*(*a)())[10]
↑ ↑↑↑↑↑↑
7 6 4 2 1 3 5
上面給出了由內向外的閱讀順序,下面來解釋它:
(1)標識符a被說明為;
(2)一個指針變量,它指向;
(3)一個函數,它返回;
(4)一個指針,該指針指向;
(5)一個有10個元素的數組,其類型為;
(6)指針型,它指向;
(7)int型數據。
因此a是一個函數指針變量,該函數返回的一個指針值又指向一個指針數組,該指針數組的元素指向整型量。

總結

以上是生活随笔為你收集整理的关于指针,可能是网上最详细的讲解了的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

免费www视频 | 啪一啪在线 | 手机在线看永久av片免费 | 亚洲天堂网视频 | 97综合网| 午夜视频在线网站 | 亚洲国产成人av网 | 日韩免费观看高清 | 久久综合色天天久久综合图片 | 久久伊人五月天 | 狠狠色丁香久久婷婷综合五月 | 91色欧美| 香蕉视频最新网址 | 天天综合网天天综合色 | 国产成人中文字幕 | 久久婷婷视频 | 国产精品嫩草55av | 美女国产网站 | www最近高清中文国语在线观看 | 久久大片网站 | 91精品在线观看视频 | 久久成人麻豆午夜电影 | 在线天堂日本 | 91黄视频在线观看 | 毛片888| 麻豆观看| 香蕉网在线 | 日韩二区三区 | 日韩天天操 | 99精品久久精品一区二区 | av福利在线播放 | 麻豆视频国产 | 在线观看国产v片 | 日韩中文字幕视频在线 | 麻豆一级视频 | 在线免费黄色片 | 91热爆在线观看 | 欧美永久视频 | 福利视频网站 | 国产午夜视频在线观看 | 精品免费一区二区三区 | 天天操天天射天天 | 69久久夜色精品国产69 | 亚洲天堂网站视频 | 超碰在线最新地址 | 手机av网站 | a√天堂资源 | 亚洲精品国偷自产在线99热 | 国产精品美女免费看 | 亚洲精品午夜久久久久久久 | 欧美日韩一级视频 | 日本中文乱码卡一卡二新区 | 久久免费黄色 | 欧美性脚交| 国产91对白在线 | 久久a久久 | 国产高清视频在线免费观看 | 天天射天天操天天 | 亚洲最新视频在线播放 | 香蕉视频亚洲 | 欧美日韩成人一区 | 天天操夜夜操国产精品 | 草久在线观看视频 | 九九在线高清精品视频 | 五月婷婷欧美 | 国产精品美女久久久久久2018 | 久草久草在线观看 | 国产一级黄大片 | 日本亚洲国产 | 久久精品人人做人人综合老师 | www免费 | 91在线视频精品 | 色在线中文字幕 | 日韩欧美精品一区二区 | 久久视频国产 | 国产福利一区在线观看 | 久久人人爽人人 | 国产系列在线观看 | 中文字幕av一区二区三区四区 | 久久久精华网 | 久久久久久久久久久久国产精品 | 在线视频 成人 | 久久99精品波多结衣一区 | 天天干天天操天天拍 | 91精品在线免费 | 99国产在线视频 | 91在线中字 | 日韩精品一卡 | 精品在线视频一区二区三区 | av在线影视 | 国产中出在线观看 | 亚洲国产精品视频 | 久久婷婷网 | 国产精品网红福利 | 91福利区一区二区三区 | 啪嗒啪嗒免费观看完整版 | 夜夜爱av | 久久久这里有精品 | 国产精品 美女 | 一区二区精品久久 | 91天堂素人约啪 | 欧美黑人性爽 | 免费观看成人 | 91黄色在线视频 | 激情伊人| 免费看的黄色片 | 国产成人精品一二三区 | 精品视频在线播放 | 韩日精品在线 | 久久手机在线视频 | 在线看片91| 中文字幕国产精品一区二区 | 国产精品视频你懂的 | 天天色天天射天天操 | 日韩大片在线播放 | 亚洲闷骚少妇在线观看网站 | 中文久久精品 | 欧美疯狂性受xxxxx另类 | 亚洲精品久久久久久中文传媒 | 夜夜操网站| 欧洲一区二区在线观看 | 三上悠亚一区二区在线观看 | 亚洲欧美在线视频免费 | 91精品在线看 | 久草在线久草在线2 | 中文视频一区二区 | 国产午夜精品一区二区三区欧美 | 免费色黄 | 中文字幕在线观看三区 | 午夜性生活片 | 欧美a级在线播放 | 成人午夜电影网站 | 97超碰福利久久精品 | 成人黄在线观看 | 国产福利网站 | 玖玖视频 | 日本系列中文字幕 | 国产99久久精品一区二区300 | 国产资源精品 | 久久久久 免费视频 | 午夜精品久久久久久久99无限制 | 成人黄性视频 | 99综合电影在线视频 | 精品亚洲午夜久久久久91 | 日韩高清免费无专码区 | www.神马久久 | 永久免费av在线播放 | 黄色亚洲精品 | 久久国产精品区 | 日韩高清在线不卡 | 国产九九九视频 | 91视频高清完整版 | 日韩有码专区 | 黄色片网站av | 麻豆一区二区 | 国产精品igao视频网入口 | 免费在线观看亚洲视频 | 在线观看av大片 | 久久免费美女视频 | 永久免费毛片在线观看 | 日韩精品在线一区 | 天天干天天射天天爽 | 欧美日韩高清国产 | 香蕉色综合 | 久久99九九99精品 | 青青久草在线 | 中文字幕av有码 | 日韩动漫免费观看高清完整版在线观看 | 日韩中文字幕在线观看 | 日韩精品视频免费看 | 亚洲人成综合 | 九九综合久久 | 久久精品国产v日韩v亚洲 | 国产综合精品久久 | 99精品国产成人一区二区 | 毛片一级免费一级 | 日本九九视频 | 国产精品门事件 | 亚洲精品免费在线播放 | 精品毛片一区二区免费看 | 国产人成在线观看 | 在线免费观看一区二区三区 | 精品夜夜嗨av一区二区三区 | 在线观看韩日电影免费 | 97色涩 | 91污在线| 亚州精品视频 | 亚洲综合丁香 | 日韩在线视频看看 | 探花在线观看 | 成人av中文字幕在线观看 | 制服丝袜成人在线 | 久久精品资源 | 国产精品国产三级国产aⅴ无密码 | 99久久婷婷国产一区二区三区 | 正在播放国产一区二区 | 日韩夜夜爽 | 日本黄区免费视频观看 | 精品国产一区二区三区久久久蜜月 | 九九精品视频在线看 | 999久久国精品免费观看网站 | 国产69精品久久久久99尤 | 久久伦理 | 亚洲va在线va天堂 | 日韩在线一级 | av在线网站免费观看 | 国产又粗又猛又黄又爽 | 国产亚洲精品美女 | 午夜精品99久久免费 | 亚洲精品国产精品99久久 | 99精品视频在线免费观看 | 久久男女视频 | 日韩精品免费在线 | 国产精品99久久免费观看 | 国产亚洲欧美精品久久久久久 | 亚州国产精品久久久 | 丁香电影小说免费视频观看 | 久久人人97超碰国产公开结果 | 天天曰夜夜爽 | 日韩在线免费看 | 在线国产激情视频 | 成人黄色电影视频 | 波多野结衣电影一区 | 国产精品久久久777 成人手机在线视频 | 欧美一级xxxx | 99这里都是精品 | 久久开心激情 | 99精品欧美一区二区蜜桃免费 | 国内丰满少妇猛烈精品播 | 久久久精品一区二区三区 | 成人黄色在线看 | 精品亚洲成a人在线观看 | 青青草在久久免费久久免费 | 久草综合在线观看 | 中文字幕一区二区三区乱码在线 | 日韩二区三区在线 | 国产一级免费观看视频 | 久久精品在线免费观看 | 久久成人午夜视频 | 一级片视频在线 | 亚洲精品视频在线观看免费 | 亚州五月| 亚洲精品影视 | 99r在线 | 国产精品欧美久久久久天天影视 | 国产精品成人a免费观看 | 国产一线二线三线在线观看 | 午夜私人影院 | 99久久一区 | 成人网在线免费视频 | av三级av| 国产精品久久三 | 中文字幕亚洲不卡 | 免费国产在线精品 | 懂色av懂色av粉嫩av分享吧 | 国产高清免费视频 | 免费看的黄色小视频 | 四虎在线免费视频 | 欧美成年人在线观看 | 91福利社区在线观看 | 国模精品一区二区三区 | 91视频大全 | 天天久久夜夜 | 久久久www成人免费毛片 | 亚洲精品乱码久久久久久久久久 | 国产群p| 五月婷婷深开心 | 国产成人福利在线观看 | 日韩精品极品视频 | 亚洲欧美精品一区二区 | 久草观看视频 | 米奇狠狠狠888 | 日韩色视频在线观看 | av片子在线观看 | 亚洲国产视频在线 | 天天色天天色 | 精品久久久成人 | 国内精品久久久久 | 久久99影院| 99热在线免费观看 | 最近免费中文字幕mv在线视频3 | a视频免费在线观看 | va视频在线 | 久久久午夜精品理论片中文字幕 | 色悠悠久久综合 | 蜜臀91丨九色丨蝌蚪老版 | 超碰在线网 | 91成版人在线观看入口 | 成年人在线免费视频观看 | 国产成人免费在线 | 国产精成人品免费观看 | 欧美日韩在线精品一区二区 | av大片免费 | 久久久久福利视频 | 中文字幕免费不卡视频 | 日韩 国产| 五月天欧美精品 | 日韩欧美国产精品 | 欧美精品久久久久久久久久白贞 | 欧美-第1页-屁屁影院 | 97在线观看视频国产 | 91视频在线自拍 | 久久av伊人 | 一区二区不卡高清 | 欧洲av不卡 | 五月开心激情 | 中文字幕电影一区 | 日韩乱色精品一区二区 | 免费日韩 精品中文字幕视频在线 | 视频国产精品 | 欧美日韩一区二区三区免费视频 | 久久视频| 日本久久电影 | 日日天天 | 欧美日韩高清在线观看 | 一区二区伦理电影 | 久久成人免费电影 | 久久公开免费视频 | 成人欧美一区二区三区黑人麻豆 | 精品黄色在线 | 欧美色综合天天久久综合精品 | 亚洲精品乱码久久久久久 | 国产精品毛片一区二区 | 日韩高清免费在线 | 亚洲码国产日韩欧美高潮在线播放 | 日本三级吹潮在线 | 最近中文字幕免费大全 | 最近中文字幕免费大全 | 国产91精品一区二区麻豆亚洲 | 这里有精品在线视频 | 日韩黄色在线电影 | 日韩成人不卡 | 嫩草91影院 | 一区二区三区免费播放 | 日韩黄色中文字幕 | 国产午夜精品免费一区二区三区视频 | 精品少妇一区二区三区在线 | 亚洲精品国产麻豆 | 久久久国产电影 | 久久成人精品电影 | 欧美日韩国产一区二区三区在线观看 | 在线视频福利 | www黄色com | 国产精品一区电影 | 国产精品一区二区三区久久 | 国产一区免费在线观看 | 天天干夜夜夜 | 精品久久久久久久久久久久 | www.夜夜骑.com | 国产丝袜网站 | 国产一级精品视频 | 天天天天色射综合 | 免费在线播放视频 | 午夜视频免费 | 国产精品av免费观看 | 亚洲人人射 | 麻豆视频免费播放 | 精品久久综合 | 国产一区二区高清视频 | 99久久精品国产亚洲 | 四虎5151久久欧美毛片 | 免费看一级特黄a大片 | 日日干夜夜爱 | 亚州天堂 | 欧美性色综合网站 | 久久黄色精品视频 | 人操人| 日韩一区正在播放 | 日韩精品久久久久 | 黄色国产高清 | 久久久国产精品一区二区三区 | 天天操比| 一区二区在线不卡 | 国产在线精品观看 | 日韩69av | 久久精品一区二区三区国产主播 | 夜添久久精品亚洲国产精品 | 有没有在线观看av | 91香蕉视频在线下载 | 日韩激情第一页 | free,性欧美 九九交易行官网 | 成人久久免费视频 | 人人超碰人人 | 欧美成年性 | 欧美另类z0zx | 日韩一区二区三免费高清在线观看 | 丁香综合| 日韩久久在线 | 免费黄色在线 | 精品国产一区二区三区久久久 | 激情视频区 | 国产精品手机在线播放 | 91在线观 | 成人wwwxxx视频 | 91精品国产福利 | 成年人免费观看国产 | 久久 地址 | 人人擦| 日日操操 | 国产视频在线免费 | 亚洲国产中文字幕 | 黄色资源网站 | 99国产一区二区三精品乱码 | 福利区在线观看 | av电影在线观看 | 亚洲精品黄| 91精品秘密在线观看 | 国产色在线视频 | 黄色在线观看污 | 在线天堂日本 | 国产精品久久99综合免费观看尤物 | 成片人卡1卡2卡3手机免费看 | 久久激情小视频 | 国产一二区视频 | 日韩肉感妇bbwbbwbbw | 久久五月婷婷丁香 | 久草久热| 狠狠躁夜夜av | 深夜免费福利网站 | 另类老妇性bbwbbw高清 | 亚洲专区 国产精品 | 成人在线免费观看网站 | 亚洲精品永久免费视频 | 黄色在线看网站 | 欧美性护士 | 最新av在线播放 | 亚洲一区美女视频在线观看免费 | 日日干天天爽 | 在线视频亚洲 | 91手机视频| 国产手机视频 | 午夜精品福利一区二区 | 亚洲精品网站 | 四虎在线免费观看视频 | 欧美久久99 | 久久综合九色综合欧美狠狠 | 97人人爽人人 | 99久久婷婷国产精品综合 | 亚洲精品在线播放视频 | 麻豆av一区二区三区在线观看 | 日韩精品中文字幕在线观看 | 一区二区三区免费播放 | 欧美地下肉体性派对 | 国产 视频 久久 | 日韩色综合 | 欧美在线a视频 | 不卡av在线免费观看 | 日韩av电影免费观看 | 婷婷激情五月 | 亚欧日韩成人h片 | 国产精品第一视频 | 欧美日韩国产一二三区 | 国产v在线观看 | 中文字幕有码在线 | 91麻豆精品国产自产在线 | av看片在线观看 | 国产精品久久网站 | 天天干天天操天天操 | 国产精品女同一区二区三区久久夜 | 91九色porny蝌蚪主页 | 天天激情综合网 | 亚洲女同videos | 国产精品免费观看国产网曝瓜 | 国产 视频 高清 免费 | 91精品老司机久久一区啪 | 亚洲一二区精品 | 精品国产一二三四区 | 亚洲精品日韩在线观看 | 亚洲精品国产高清 | 婷婷www| 99国内精品久久久久久久 | 亚洲国产精品电影 | 国产视频综合在线 | 国产精品久久久久久久久大全 | 91精品国产网站 | 午夜精品久久久久久久99无限制 | 久99久中文字幕在线 | 中文字幕在线视频国产 | 亚洲精品国产精品国自产 | 玖玖爱免费视频 | 涩涩网站在线观看 | 国产成人久久精品77777 | 精品久久一级片 | 日韩精品电影在线播放 | 最近日韩中文字幕中文 | 亚洲精品综合一二三区在线观看 | 国产综合在线观看视频 | 五月天六月婷婷 | 免费在线观看成人 | 国产精品一区二区三区视频免费 | 天天干天天操天天入 | 91免费高清视频 | 99爱精品视频| 久久国产精品久久w女人spa | 国产成人亚洲在线观看 | 激情婷婷综合网 | 国产真实在线 | 最近中文字幕mv | 在线一区二区三区 | 日日夜av| 麻豆传媒视频在线免费观看 | 欧美日韩伦理在线 | 国产免费人成xvideos视频 | 精品免费久久久久 | 亚洲综合在线发布 | 国色天香第二季 | 91av在线不卡 | 国产精品第一视频 | 精品在线你懂的 | 人人添人人澡人人澡人人人爽 | 在线亚洲高清视频 | 色综合狠狠干 | 亚洲精品美女久久久久网站 | 成年人黄色大全 | 久久不色 | 欧美亚洲免费在线一区 | 亚洲永久在线 | 狠狠色噜噜狠狠狠狠 | 天堂av在线免费 | 欧美a性 | 免费观看黄 | 国产精品尤物视频 | 91成人久久 | 国产在线黄 | 国产精品久久久久av | 中文字幕在线不卡国产视频 | 中文在线中文资源 | 一区二区三区免费在线观看视频 | 日韩高清精品一区二区 | 久热超碰| 天天爱天天射 | 国产91免费看 | 国产成人精品久久亚洲高清不卡 | 中文字幕日本在线 | 在线韩国电影免费观影完整版 | 婷婷色综 | 91在线影视 | www.av在线.com | 国产免费黄色 | 99精品在线看 | 久久精品一区二区三区四区 | 91福利视频免费观看 | 精品亚洲网 | 久久九九视频 | 天天干天天做天天操 | 99久久久成人国产精品 | 日本一区二区三区免费观看 | 欧美日韩三区二区 | 久久久久久久久久久久av | 99精品国产免费久久 | 97超碰成人在线 | www.久久视频 | 狠狠的操你 | 亚洲精品在线视频观看 | 国产麻豆传媒 | 国产 视频 久久 | 开心激情网五月天 | 久久免费视频4 | 不卡视频在线 | 国产精品密入口果冻 | 中文字幕丝袜 | 九九免费精品 | 91精品视屏| 在线看中文字幕 | 九九热在线视频 | 国产一级电影在线 | 免费一级片在线 | 日韩r级在线| 九九热视频在线免费观看 | 黄a在线看 | 精品国产区在线 | 91亚洲精品久久久中文字幕 | 天天色成人 | 97在线免费视频 | 色综合久久久久久久久五月 | 日韩精品中文字幕在线观看 | 亚洲天堂网视频在线观看 | 在线观看一级视频 | 99久久er热在这里只有精品66 | 亚洲精品国偷拍自产在线观看蜜桃 | 91视频在线免费下载 | 手机av资源 | 久久黄色片 | 91大神在线看 | 欧美日韩超碰 | 一本一道久久a久久精品 | 国产亚洲日本 | 人人狠狠综合久久亚洲 | 特级毛片网站 | 久草com | 久久综合久久综合久久综合 | 狠狠精品 | 久草.com| 亚洲免费观看视频 | 国产成人在线免费观看 | 免费高清在线观看电视网站 | 综合网天天射 | 免费在线黄 | 欧美日韩高清一区二区 国产亚洲免费看 | 天天色宗合 | 成人午夜精品 | 最近中文字幕在线中文高清版 | 久久久精品影视 | 在线观看亚洲专区 | 久久视频免费 | 成人黄色影片在线 | 精品国产亚洲在线 | 精品久久久久久久久久久久久久久久久久 | 日韩免费在线视频观看 | 久久久资源 | 中文字幕第一页av | 久久精品久久久久电影 | 亚洲h色精品| www178ccom视频在线 | 国产 一区二区三区 在线 | 久草视频在线免费 | 99久久国产免费免费 | 91热爆视频 | www好男人 | 午夜久久精品 | 久久精品—区二区三区 | 亚洲国产剧情av | 国产日韩欧美在线影视 | 99热超碰 | 欧美色综合久久 | 婷婷九月丁香 | 国产日韩欧美中文 | 欧美精品久久久久久久久久 | 久久一视频 | 亚洲精欧美一区二区精品 | 日本一区二区三区免费观看 | 国内精品久久久久影院日本资源 | 在线视频成人 | 亚洲黑丝少妇 | 久久av网| 国产精品免费在线观看视频 | 午夜精品一二区 | 成人中文字幕在线观看 | 国产69精品久久久久久 | 男女视频国产 | 一区二区三区电影在线播 | 色人久久 | 亚洲2019精品 | 国产又粗又长的视频 | 国产又黄又猛又粗 | www.国产高清 | 日韩亚洲在线视频 | 日韩久久视频 | 成人毛片一区 | 狠狠干夜夜操天天爽 | 99自拍视频在线观看 | 又爽又黄又刺激的视频 | 黄色成品视频 | 中文字幕在线播放日韩 | 国产剧情在线一区 | 久久av免费电影 | 天天天干天天射天天天操 | 欧美一二三区播放 | av成人免费观看 | 成人av电影免费在线观看 | 国产午夜一区 | 欧美成天堂网地址 | 国产又粗又猛又黄又爽的视频 | 国产不卡av在线播放 | 亚洲人成精品久久久久 | 国内久久久久 | 精品国内自产拍在线观看视频 | 久久人人97超碰国产公开结果 | 亚洲 欧洲av| 人人插人人 | 91亚洲精品久久久中文字幕 | a级免费观看 | 午夜av一区| 精品亚洲午夜久久久久91 | 国产精品美女在线观看 | 欧美色图东方 | 亚洲午夜久久久久久久久 | 97视频免费在线 | 日韩久久久久久久久久久久 | 国产做爰视频 | 开心综合网 | 一级全黄毛片 | 日本高清免费中文字幕 | 97视频播放| 日本精品久久久久中文字幕 | 欧美久久成人 | 国产日韩欧美自拍 | www久久com| 久久久999精品视频 国产美女免费观看 | 波多野结衣久久资源 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 操操综合 | 日韩一二三 | 视频直播国产精品 | 国产 中文 日韩 欧美 | 婷婷色站 | 天天操天天能 | 日韩动态视频 | 久久久久久久久福利 | 欧美一级片在线播放 | 成人av一区二区三区 | 夜夜操天天| 久操视频在线免费看 | 久久精品www人人爽人人 | 亚洲欧洲成人精品av97 | 精品国产一区二区三区四区在线观看 | 91精品办公室少妇高潮对白 | 久久一区二区三区四区 | 久九视频 | 91视频在线免费 | 91av视频网站 | 国产黄色理论片 | 狠狠色丁香婷婷综合基地 | 人人揉人人揉人人揉人人揉97 | 免费成人av在线看 | 在线观看网站av | 国产精品一区二区三区免费看 | 国产精品99久久久久久人免费 | 精品一二三区 | 亚洲精品网址在线观看 | 在线播放你懂 | 日韩av伦理片 | 久久中文字幕视频 | 欧美男同视频网站 | 日韩首页| 午夜精品一区二区三区在线视频 | 久久在草 | 日韩av播放在线 | 99国产成+人+综合+亚洲 欧美 | 日韩av视屏在线观看 | 欧美性极品xxxx娇小 | 国产成人福利片 | 欧美亚洲一区二区在线 | aaawww| 国产一级片久久 | 91精品国产福利在线观看 | 欧美久久久久久久 | 成人一级电影在线观看 | 日韩美av在线 | 91超在线 | 精品嫩模福利一区二区蜜臀 | 国产人免费人成免费视频 | 亚洲乱亚洲乱妇 | 久久国产精品免费一区 | 97成人资源站 | 成人久久久电影 | av先锋中文字幕 | 在线亚洲成人 | 久久精品老司机 | 日日夜夜骑| 亚洲黄色a| 18av在线视频 | 国产精品午夜免费福利视频 | 亚洲精欧美一区二区精品 | av免费观看网址 | 韩国av免费看| 国产一区二区久久久久 | 午夜久久久久久久 | 久久免费黄色大片 | 国产99色| www.夜夜操 | 欧美日韩裸体免费视频 | 日韩激情影院 | 久久日韩精品 | 99热国产在线中文 | 成人sm另类专区 | av在线播放观看 | 精品国产乱子伦一区二区 | 干亚洲少妇 | 亚洲精品视频网站在线观看 | 亚洲人视频在线 | 欧美视频日韩视频 | 亚洲高清视频在线 | 天天干天天做天天操 | 在线成人免费电影 | 国产精品区免费视频 | 成人动漫一区二区三区 | 日韩成人高清在线 | 久久香蕉电影 | 欧美精品久久久久 | 黄色av在 | 日韩欧美在线视频一区二区 | av免费黄色| 欧美极度另类性三渗透 | 干av在线| 韩日精品中文字幕 | 亚洲黄色成人av | 国产精品一区二区三区免费视频 | 精品国产伦一区二区三区观看方式 | 五月综合久久 | 日韩在线大片 | 日韩欧美在线观看 | 日韩电影中文字幕在线观看 | 国产欧美日韩精品一区二区免费 | 在线涩涩 | 欧美久久久一区二区三区 | 九九欧美 | 久久精品网址 | 狠狠色综合网站久久久久久久 | 欧美激情视频在线免费观看 | 日本久久中文字幕 | 午夜 免费 | 国产精品久久久久aaaa | av在线免费网站 | 二区三区毛片 | 天天操天天操 | 免费午夜视频在线观看 | 日韩av不卡播放 | 999电影免费在线观看 | 久久久免费精品视频 | 在线成人一区二区 | 最新日韩精品 | 国产精美视频 | 成人av影视观看 | 91精品免费在线 | 日韩欧美在线高清 | 激情视频在线高清看 | 欧美成人在线免费观看 | 欧美特一级片 | 最新av在线网站 | 亚洲精品日韩一区二区电影 | 性色av香蕉一区二区 | 亚洲国产美女精品久久久久∴ | 欧美analxxxx| 亚洲手机天堂 | 色婷婷激情四射 | 一区二区三区久久 | 天天操天天操天天操天天操天天操 | 人人看黄色 | 亚洲精品美女久久17c | 久久天天综合网 | 欧美精品xxx | 99精品在线免费 | 精品久久久久久久久久岛国gif | 中文成人字幕 | 久久不射影院 | 黄色a一级片| 超碰97中文| 亚洲天堂网站 | 国产精品成人自产拍在线观看 | 不卡精品视频 | 亚洲天堂网在线观看视频 | 久久久久久免费视频 | 天天操天天干天天插 | 亚洲精品www久久久久久 | 最新日韩精品 | 91福利视频一区 | 美女视频黄在线 | 久久艹人人 | 91欧美在线 | 欧美精品乱码久久久久久 | 天天操天天干天天综合网 | 91人人澡人人爽人人精品 | 中日韩在线视频 | 久久国产精彩视频 | 天天色天天操天天爽 | 中文字幕 国产视频 | 欧美午夜a | 日日久视频 | 精品日韩在线一区 | 日韩免费观看一区二区三区 | 日韩在线免费小视频 | 日韩精品一区二区三区不卡 | 五月色综合 | 日韩一二区在线观看 | 91精品国产92久久久久 | 久久黄色影院 | 久久视频中文字幕 | 国产精品18久久久久久久久 | 99精品热| 日韩mv欧美mv国产精品 | 国产中出在线观看 | 一本一本久久a久久 | 日韩av免费在线电影 | 免费在线观看黄 | 国产最新精品视频 | 国产精选视频 | 免费看v片| 五月天综合| japanese黑人亚洲人4k | 色久av| 久久成年人网站 | 天天色天天操综合 | 成人国产精品久久久 | 91女子私密保健养生少妇 | 玖玖玖国产精品 | 国产精品自产拍在线观看网站 | 久久精品99国产精品日本 | 九九九毛片 | 亚洲自拍自偷 | 久久久久久国产精品免费 | 精品一区二区在线免费观看 | 欧美伦理一区二区三区 | 国产精品 中文在线 | 九九热精品视频在线播放 | 婷婷色av | 中文字幕电影高清在线观看 | 色狠狠狠 | 日本在线观看视频一区 | www.色午夜,com | 丁香婷婷综合色啪 | 久久久www成人免费毛片麻豆 | 亚洲人精品午夜 | 婷婷伊人综合 | 国产色啪| 在线小视频国产 | www成人精品 | 99在线观看精品 | 日韩三级精品 | www.久久免费视频 | 在线精品亚洲一区二区 | 久久一级片 | 欧美日韩亚洲精品在线 | 日韩欧美一区二区三区在线观看 | 成人网色| 日韩精品视频免费专区在线播放 | 亚洲一区二区视频 | 一区免费在线 | www.狠狠色| 又黄又爽免费视频 | 国产aaa大片 | 国产视频 久久久 | 欧美日韩免费在线视频 | 中文字幕丰满人伦在线 | 久久精品美女 | 久久激情小视频 | 久久精品欧美日韩精品 | 91亚洲精品国偷拍 | 国产日韩视频在线 | 亚洲午夜剧场 | 免费中文字幕在线观看 | 午夜影视一区 | 美女黄网站视频免费 | 黄色在线免费观看网站 | 久久夜色精品国产欧美乱极品 | 国产一区二区不卡视频 | 欧美精品视| 91免费看黄色 | 91网站在线视频 | 超碰免费97 | 久久国产免费看 | 中文字幕最新精品 | 91九色在线观看视频 | 草久久久久久 | 91香蕉视频黄色 | 视频在线在亚洲 | 国产福利在线不卡 | 国产精品久久久久婷婷二区次 | 日韩免费视频线观看 | 婷婷精品国产欧美精品亚洲人人爽 | 国产精品av电影 | 日韩专区在线观看 | 国产成人免费观看 | 亚洲精品国产精品国 | 国语精品免费视频 | av三级在线免费观看 | 99在线观看精品 | 色九色| 99久久久国产精品美女 | 日韩,精品电影 | 成人资源在线播放 | 日本在线精品视频 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 国产精品麻豆免费版 | 国产亚洲91 | 在线观看国产成人av片 | 深爱开心激情 | 日韩二区三区 | 97精品一区 | 97操操操 | 97福利在线 | 伊人一级| 国产 视频 久久 | 国产成人精品综合久久久久99 | 伊人资源视频在线 | 国产91电影在线观看 | 看av免费 | 国产丝袜 | 99久久久久久国产精品 | 精品一区二区在线观看 | 中文字幕国产一区 | 久久久久久久久福利 | 精品在线小视频 | 中文字幕 在线看 | 国产精品1024| 性色大片在线观看 | 热久在线 | 欧美另类z0zx | 亚洲精品一区二区在线观看 | 久操久| 国产精品观看视频 | 久久久久久久久久久久久久电影 | 久久久久久久久久久久av | 一区二区三区手机在线观看 | 久久影院午夜论 | 日韩欧美视频在线免费观看 | 久久国内视频 | 黄色网中文字幕 |