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

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

二.指針的定義及運算

2019-11-06 06:03:53
字體:
來源:轉載
供稿:網友
           二.指針的定義及運算

上一講已經說過,指針是一種變量,它也有自己的地址,但由于它是專門用來存放地址的變量,所以把它認為是種特殊的變量,既然有著特殊的身份,那么也理應受到特殊的待遇,下面來看看它享受了那些優待。

1.指針的定義

在C語言中,定義一個普通的變量(如整型數),我們這樣做:int i; 而定義一個指針變量(指針)我們需要這樣做:int *p ;  還記得嗎,一個矩形中的值是有類型的,可能是整型,可能是字符型……,它們原本是“清白”的,無類型的,是我們通過一些手段使它們有了類型。當我們做出int i; 這樣一個定義時,編譯器就會分配一個地址(例如200)并和i 關聯起來,而int將限定編譯器把這個區域中的內容作為整型數看待。

               矩形內的值被視為int型   

現在我們又有了int *p;這個定義,假設p是指向變量i的(見下圖),p中存的是變量i的地址。* 表示p是一個指針,而int表示p中所存的地址對應的變量(即變量i)的類型是int。

                             p指向i , int *p;中的int是指針p所指向的變量的類型

我們將int稱為指針p的基類型,或指針p所指向的變量的類型。

類似地,我們可以有: char  *s ;   ( s是指向char型變量的指針 )

  float  *f ;    ( f是指向float型變量的指針 )

  double  *d ;  ( d是指向double型變量的指針 )

由此得到聲明一個指針變量(指針)的一般形式 : 基類型  * 指針名;

有一點要注意,在定義指針時,以下兩種方式都是允許的,例如:

int  *ptr1;

int*  ptr2;

但一般比較傾向用第一種,因為可以避免以下的誤解:

int*  PRt1,   ptr2;

這樣的定義方式,容易使人誤以為ptr2也是一個指針,事實上并不是,prt2是一個int型變量,以下的定義方式中ptr1與ptr2才都是指針:

int* ptr1,  *ptr2;

2.指針的運算

<1>.&(address-of Operator)取地址操作符:

究竟如何使一個指針指向一個變量呢?后面的語句給出了解答:int *p = &i;& 用于取一個對象的地址(本文說的對象是泛指的某一事物,如變量,數組等,和C++中的對象概念不同),這里用于將i的地址賦給p, 那么指針p就指向了變量i 。上述的語句也可以分開寫,如:int *p;  p = &i;

小擴展:(下面大括號中的內容,出涉指針的朋友可以跳過,當然也可以作為擴展知識)

{&的實質:當對一個T類型對象進行 & 操作時,返回的是一個“指向T的指針”類型的常量,即指針常量(pointer constant),在我們使用&運算符時我們并不關心它是如何實現的,因為有編譯器幫我們隱藏了這些細節。

可當我們想要對一個指針賦一個絕對地址的時候,這個問題就體現出來了,而且我們不得不去關注,在C語言中沒有一種內建(built-in)的方法去表示指針常量,所以當我們使用它的時候通常先寫成整型常量的形式,然后再通過強制類型轉換把它轉換成相應的類型,如:int * , double * , char *等。 所以后面所示的做法是不行的: int *p = 0x12345678 ; 正確的方式應為:int *p = (int *) 0x12345678; 也許大家還記得我在第一講中說的要注意指針中只能存放地址,不能將一個非0值整型常量表達式或者其他非地址類型的數據賦給一個指針,原因就在此。在大多數計算機中,內存地址確實是以無符號整型數來表示的,而且多以16進制表示,但我們在C語言中不能用整型數去表示地址,只能用指針常量來表示,因為它是被用來賦給一個指針的。

對于這個賦值問題還可以換一個角度去理解,在C語言中,使用賦值操作符時,賦值操作符左邊和右邊的表達式類型應該是相同的,如果不是,賦值操作符將試圖把右邊表達式的值轉換為左邊的類型。所以如果寫出int *p = 0x12345678 ; 這條語句編譯器會報錯:'=' : cannot convert from ' const int ' to ' int* ' ,因為賦值操作符左邊和右邊的表達式的類型應該相同,而0x12345678是int型常量,p是一個指向int型的指針,兩者類型不同,所以正確的方式是:int *p = (int *) 0x12345678 ; }

<2>.* (Dereference operator) 解引用操作符

* 在定義時用來說明一個變量是指針,而在定義了一個指針之后,我們使用(引用)指針時,*p表示的是p所指向的對象(即i)。也就是說,對于一個已定義的指針使用 * 操作符,將訪問這個指針所指向的對象,我們來看下面的程序:

#include<stdio.h>

int main()

{

int i;                    /*定義一個int型變量i*/

int *p;                  /* 定義一個指向int類型的指針p */

i = 2 ;                 /* 初始化i為2 */

p = &i ;               /* 將i的地址賦給p ,即使p指向i */

printf("%d/n", i ) ;       /*輸出i的值 */

printf("%d/n", *p ) ;     /* 輸出p所指向的存儲單元的值,即i的值*/

return 0 ;            /* 標準C語言主函數應返回一個值,用以通知操作系統程序執行成功與否,通常0表示成功*/

}

程序輸出結果為:

2

2

對于 * 操作符,由于它有兩個等價的術語dereference和indirection ,所以在國內的書籍中你會看到各種翻譯方法,如:解引用、解除引用、反引用、反向引用、間接引用、間接訪問……

只要你知道它是用來訪問一個指針所指向的對象的,那么不管它叫什么都不重要了。還是那句話,弄懂是什么,不要在乎叫什么,如果你理解了它的真正含義,大可以簡潔地稱它為“星號”操作符!

3.指針的初始化

ANSI C定義了零指針常量的概念:一個具有0值的整形常量表達式,或者此類表達式被強制轉換為void *類型,則稱為空指針常量,它可以用來初始化或賦給任何類型的指針。也就是說,我們可以將0、0L、'/0'、2–2、0*5以及(void*)0賦給一個任何類型的指針,此后這個指針就成為一個空指針,由系統保證空指針不指向任何對象或函數。

ANSI C還定義了一個宏NULL,用來表示空指針常量。大多數C語言的實現中NULL是采用后面這種方式定義的:#define  NULL  ((void*)0)。

對指針進行初始化時常用的有以下幾種方式:

  1.采用NULL或空指針常量,如:int *p = NULL;或 char *p = 2-2; 或float*p = 0;

  2.取一個對象的地址然后賦給一個指針,如:int i = 3;  int *ip = &i;

  3.將一個指針常量賦給一個指針,如:long *p = (long *)0xfffffff0;

  4.將一個T類型數組的名字賦給一個相同類型的指針,如:char ary[100]; char *cp = ary;

  5.將一個指針的地址賦給一個指針,如:int i = 3;  int *ip = &i;int **pp = &ip;

  6.將一個字符串常量賦給一個字符指針,如:char *cp = “abcdefg”;

對指針進行初始化或賦值的實質是將地址或同類型(或相兼容的類型)的指針賦給它,而不管這個地址是怎么取得的。要注意的是:對于一個不確定要指向何種類型的指針,在定義它之后最好把它初始化為NULL,并在解引用這個指針時對它進行檢驗,防止解引用空指針。另外,為程序中任何新創建的變量提供一個合法的初始值是一個好習慣,它可以幫你避免一些不必要的麻煩。

4.void *型指針

ANSI C定義了一種void *型指針,表示定義一個指針,但不指定它指向何種類型的數據。void *型指針作為一種通用的指針,可以和其它任何類型的指針(函數指針除外)相互轉化而不需要類型強制轉換,但不能對它進行解引用及下標操作。C語言中的malloc函數的返回值就是一個void *型指針,我們可以把它直接賦給一個其他類型的指針,但從安全的編程風格角度以及兼容性上講,最好還是將返回的指針強制轉換為所需的類型,另外,malloc在無法滿足請求時會通過返回一個空指針來作為“內存分配失敗”的信號,所以要注意返回值指針的判空。

5.指向指針的指針

在指針初始化的第5種方式中提到了用一個指針的地址來初始化一個指針?;貞浺幌律弦恢v的內容:指針是一種變量,它也有自己的地址,所以它本身也是可用指針指向的對象。我們可以將指針的地址存放在另一個指針中,如:

int i = 5000;

int *pi = &i;

int **ppi =&pi;

此時的ppi即是一個指向指針的指針,下圖表示了這些對象:

                          

i的地址為108,pi的內容就是i的地址,而pi的地址為104,ppi的內容即是pi的地址。對ppi解引用照常會得到ppi所指的對象,所獲得的對象是指向int型變量的指針pi。想要真正地訪問到i.,必須對ppi進行兩次解引用,如下面代碼所示:

printf("%d/n", i );

printf("%d/n", *pi );

printf("%d/n", **ppi );

以上三條語句的輸出均為5000。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美中文在线免费| 日本精品免费一区二区三区| 国产一区二中文字幕在线看| 狠狠躁夜夜躁人人躁婷婷91| 精品国产一区二区三区久久| 91精品国产沙发| 亚洲精品美女视频| 精品久久久国产| 韩国v欧美v日本v亚洲| 亚洲一区制服诱惑| 国产成人精品午夜| 亚洲人成自拍网站| 萌白酱国产一区二区| 久久久久久国产| 亚洲精品一区二区三区婷婷月| 久久久精品2019中文字幕神马| 亚洲欧美日韩视频一区| 亚洲xxx自由成熟| 国模精品系列视频| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲精品91美女久久久久久久| 亚洲欧美国产精品久久久久久久| 精品亚洲国产成av人片传媒| 欧美日韩加勒比精品一区| 精品视频在线观看日韩| 亚洲成人激情在线观看| 97久久伊人激情网| 国产精品久久婷婷六月丁香| 成人久久18免费网站图片| 亚洲成avwww人| 97国产在线观看| 亚洲欧美激情四射在线日| 日韩av电影手机在线观看| 国产91色在线|免| 成人免费视频xnxx.com| 国产亚洲欧美aaaa| 最近2019中文字幕大全第二页| 久久久免费精品视频| 在线观看日韩欧美| 国产亚洲精品久久久久久| 亚洲美女福利视频网站| 欧美激情视频网址| 在线视频日本亚洲性| 欧美激情第6页| 亚洲国产另类久久精品| 欧美日韩高清在线观看| 日韩av电影院| 在线视频中文亚洲| 日韩在线观看免费全| 国产日韩欧美91| 欧美日韩国产麻豆| 国产视频精品自拍| 日本乱人伦a精品| 97在线视频精品| 538国产精品一区二区在线| 81精品国产乱码久久久久久| 国产美女被下药99| 91高清在线免费观看| 深夜福利91大全| 日韩毛片在线看| 国产精自产拍久久久久久| 性色av香蕉一区二区| 成人亚洲综合色就1024| 日韩va亚洲va欧洲va国产| 国产综合色香蕉精品| 久久精品这里热有精品| 久久精品99无色码中文字幕| 成人字幕网zmw| 日韩国产欧美精品在线| 欧美性20hd另类| 亚洲成人免费在线视频| 欧美日韩成人黄色| 久久精品成人欧美大片古装| 亚洲精品日韩久久久| 亚洲人精品午夜在线观看| 国产视频在线一区二区| 国产91露脸中文字幕在线| 色青青草原桃花久久综合| 精品久久久免费| 91夜夜未满十八勿入爽爽影院| 久久久久久久久中文字幕| 久久久久99精品久久久久| 91视频国产精品| 亚洲综合第一页| 国产精品免费小视频| 久久夜色精品亚洲噜噜国产mv| 欧美一级淫片videoshd| 国产精品扒开腿做爽爽爽视频| 国产免费观看久久黄| 久久精品国产欧美亚洲人人爽| 欧美一级视频一区二区| 91a在线视频| 亚洲最新中文字幕| 俺去亚洲欧洲欧美日韩| 91tv亚洲精品香蕉国产一区7ujn| 国产精品美女午夜av| 91黄色8090| 4444欧美成人kkkk| 国产精品久久视频| 欧美极品少妇xxxxx| 国产精品夜色7777狼人| 国产精品美女www爽爽爽视频| 国产精品一二三视频| 国产99久久精品一区二区 夜夜躁日日躁| 日韩精品欧美激情| 亚洲午夜女主播在线直播| 日本成人精品在线| 不卡av在线播放| 亚洲91精品在线| 国产精品视频网址| 自拍偷拍亚洲精品| 欧美激情videoshd| www.日韩av.com| 2019中文字幕在线观看| 国产欧美一区二区白浆黑人| 久久69精品久久久久久久电影好| 97人人做人人爱| 日韩在线观看av| 欧美在线视频一二三| 91精品久久久久久久久久久| 欧美高清视频一区二区| 欧美成人一区二区三区电影| 欧美黄色片视频| 亚洲小视频在线| 日韩电影中文字幕av| 欧美激情中文网| 成人激情在线播放| 国产丝袜视频一区| 亚洲国产精品va| 国产一区二区三区直播精品电影| 国产一区二区三区免费视频| 国产欧美日韩精品丝袜高跟鞋| 国产一区欧美二区三区| 日韩欧美高清在线视频| 欧美专区在线播放| 亚洲国产另类 国产精品国产免费| 97在线视频精品| 狠狠色狠狠色综合日日小说| 国内免费久久久久久久久久久| 韩国福利视频一区| 国产91九色视频| 国产欧美在线看| 日韩精品免费在线观看| 欧美日韩国产色| 国产欧美在线观看| www.xxxx欧美| 亚洲第一国产精品| 97超碰色婷婷| 中文日韩电影网站| 亚洲美女黄色片| 亚洲精品一区二三区不卡| 国产精品欧美久久久| 自拍偷拍亚洲精品| 国产一区二区免费| 国产美女精彩久久| 久久99精品久久久久久噜噜| 中文字幕亚洲一区| 国产精品扒开腿做爽爽爽的视频| 18一19gay欧美视频网站| 欧美亚洲免费电影| 国产va免费精品高清在线| 国产精品成人国产乱一区| 久久久久久久久中文字幕| 欧美极品在线播放|