亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C語言程序設計基礎講座之指針的慨念

2019-11-17 05:16:34
字體:
來源:轉載
供稿:網友

  指針是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)賦值運算

  指針變量的賦值運算有以下幾種形式:

 ?、僦羔樧兞砍跏蓟x值,前面已作介紹。

 ?、诎岩粋€變量的地址賦予指向相同數據類型的指針變量。例如:

int a,*pa;
pa=&a; /*把整型變量a的地址賦予整型指針變量pa*/
 ?、郯岩粋€指針變量的值賦予指向相同類型變量的另一個指針變量。如:

int a,*pa=&a,*pb;
pb=pa; /*把a的地址賦予指針變量pb*/
  由于pa,pb均為指向整型變量的指針變量,因此可以相互賦值。

 ?、馨褦到M的首地址賦予指向數組的指針變量。

  例如:

int a[5],*pa;
pa=a; (數組名表示數組的首地址,故可賦予指向數組的指針變量pa)
  也可寫為:

pa=&a[0]; /*數組第一個元素的地址也是整個數組的首地址,
  也可賦予pa*/

  當然也可采取初始化賦值的方法:

int a[5],*pa=a;
 ?、莅炎址氖椎刂焚x予指向字符類型的指針變量。例如: char *pc;pc="c language";或用初始化賦值的方法寫為: char *pc="C Language"; 這里應說明的是并不是把整個字符串裝入指針變量, 而是把存放該字符串的字符數組的首地址裝入指針變量。 在后面還將具體介紹。

 ?、薨押瘮档娜肟诘刂焚x予指向函數的指針變量。例如: 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)兩個指針變量之間的運算只有指向同一數組的兩個指針變量之間才能進行運算, 否則運算毫無意義。
 ?、賰芍羔樧兞肯鄿p

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

 ?、趦芍羔樧兞窟M行關系運算

  指向同一數組的兩指針變量進行關系運算可表示它們所指數組元素之間的關系。例如:

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不是空指針??罩羔樖怯蓪χ羔樧兞抠x予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;
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产乱码久久久久久婷婷| 国产精品视频公开费视频| 欧洲s码亚洲m码精品一区| 精品久久久精品| 国产精品日韩精品| 国产在线精品播放| 国产精品无码专区在线观看| 亚洲淫片在线视频| 亚洲精品一区av在线播放| 欧美激情免费看| 久久久久久91| 亚洲一区二区免费在线| 中文字幕久热精品在线视频| 亚洲剧情一区二区| 亚洲最大在线视频| 国内精品久久久久影院 日本资源| 中文字幕久热精品视频在线| 久久伊人精品视频| 色婷婷综合久久久久| 国产精品视频导航| 国产噜噜噜噜噜久久久久久久久| 欧美在线一级va免费观看| 国产91精品青草社区| 91天堂在线视频| 神马久久久久久| www.国产精品一二区| 亚洲国产婷婷香蕉久久久久久| 国产一区视频在线| 欧美大片在线免费观看| 国产精品自拍视频| 最近2019免费中文字幕视频三| 国产69精品久久久久99| 91青草视频久久| 亚洲男人第一av网站| 国产成人av网址| www.亚洲一区| 亚洲日韩欧美视频| 亚洲最大福利视频网站| 亚洲**2019国产| 91免费的视频在线播放| 亚洲第一视频网| 精品国产福利视频| 韩国欧美亚洲国产| 国产午夜精品一区二区三区| 亚洲精品久久久久久久久久久久| 日韩av影视在线| 亚洲一区美女视频在线观看免费| 国产精品免费视频xxxx| 欧美视频中文字幕在线| 午夜精品99久久免费| 亚洲免费视频一区二区| 欧美一级视频免费在线观看| 亚洲第一视频网站| 久久成人在线视频| 成人午夜高潮视频| 日韩欧美亚洲范冰冰与中字| 亚洲精品一区av在线播放| 日韩av手机在线看| 国产精品最新在线观看| 亚洲欧美成人网| 久热国产精品视频| 欧美成人精品h版在线观看| 疯狂做受xxxx高潮欧美日本| 欧洲成人在线视频| 色777狠狠综合秋免鲁丝| 欧美色xxxx| 国产精品美腿一区在线看| 一区二区欧美久久| 亲子乱一区二区三区电影| 一本一本久久a久久精品牛牛影视| 亚洲精品美女免费| 成人春色激情网| 98午夜经典影视| 国产盗摄xxxx视频xxx69| 日韩中文字幕国产精品| 亚洲色图偷窥自拍| 欧美日韩人人澡狠狠躁视频| 欧美理论电影在线播放| 精品美女国产在线| 亚洲国产成人精品电影| 亚洲黄页网在线观看| 国产欧美久久久久久| 国产精品极品尤物在线观看| 国产精品青青在线观看爽香蕉| 色婷婷av一区二区三区久久| 美日韩在线视频| 久久夜色精品国产亚洲aⅴ| 国产美女久久精品香蕉69| 九九精品视频在线| 亚洲精品99久久久久中文字幕| 久久人人爽人人爽人人片av高请| 精品久久香蕉国产线看观看亚洲| 最近更新的2019中文字幕| 亚洲护士老师的毛茸茸最新章节| 亚洲精品av在线播放| 日本欧美中文字幕| 国产精品视频xxx| 91免费在线视频网站| 中文字幕欧美日韩精品| 2019亚洲日韩新视频| 国产精品视频一区二区高潮| 色yeye香蕉凹凸一区二区av| 精品视频在线播放色网色视频| 亚洲第一av网站| 最近2019年好看中文字幕视频| 国产这里只有精品| 国产美女精品免费电影| 久久亚洲国产成人| 欧美性精品220| 亚洲综合精品一区二区| 色哟哟入口国产精品| 美日韩精品视频免费看| 精品亚洲一区二区三区在线观看| 亚洲国产精品嫩草影院久久| 国产精品美女无圣光视频| 一本一本久久a久久精品综合小说| 国产精品视频自拍| 日韩精品在线视频观看| 日本一区二三区好的精华液| 久久久www成人免费精品张筱雨| 日韩中文字幕久久| 国产欧美欧洲在线观看| 国产免费亚洲高清| 亚洲欧美制服综合另类| 国产精品免费看久久久香蕉| 欧美视频不卡中文| 欧美成人高清视频| 色悠悠久久88| 国产有码在线一区二区视频| 中文字幕视频在线免费欧美日韩综合在线看| 国产精品久久久久久亚洲影视| 国产欧美精品一区二区| 日韩免费在线视频| 日韩成人av在线| 岛国av一区二区三区| 欧美有码在线观看视频| 69国产精品成人在线播放| xxxxx成人.com| 亚洲深夜福利网站| 国产日产欧美精品| 欧美一区二粉嫩精品国产一线天| 91在线高清免费观看| 少妇高潮 亚洲精品| 亚洲一区二区三区在线免费观看| 亚洲国产精品久久久久久| 亚洲成人av片在线观看| 97久久精品视频| 日韩中文字幕精品| 在线电影av不卡网址| 久久伊人精品一区二区三区| 久久精品国产亚洲精品| 欧美激情性做爰免费视频| 爽爽爽爽爽爽爽成人免费观看| 91免费精品国偷自产在线| 97在线看免费观看视频在线观看| 亚洲男人天堂网| 亚洲精品福利免费在线观看| 色诱女教师一区二区三区| 丰满岳妇乱一区二区三区| 日韩久久免费电影| 国产一区二区三区日韩欧美| 欧美床上激情在线观看| 中文字幕亚洲欧美日韩高清| 69国产精品成人在线播放|