5.1 指標與地址 (C)

來源:互聯網
上載者:User
 

指標與地址

——《C程式設計語言(第2版-新版)》5.1

 

   一元運算子&可用於取一個對象的地址,因此,下列語句:

 p = &c;

將把 c 的地址賦值給變了p,我們稱 p 為“指向”c的指標。地址運算子&只能應用於記憶體中的對象,即變數與數組元素。它不能作用於運算式、常量或 register 類型的變數。

 

   一元運算子*是間接定址或間接引用運算子。當它作用與指標時,將訪問指標所指向的對象。我們在這裡假定 x 與 y 是整數,而 ip 是指向 int 類型的指標,下面的代碼說明了如何在程式中聲明指標以及如何使用運算子&和*:


int x = 1, y = 2, z[10];
int *ip;   /* ip is a pointer to int */

ip = &x;   /* ip now points to x */
y = *ip;   /* y is now 1 */
*ip = 0;   /* x is now 0 */
ip = &z[0] /* ip now points to z[0] */

 

  我們來看指標 ip 的聲明,如下所示:

  int *ip;

這樣聲明是為了便於記憶。該聲明語句表明運算式*ip的結果是int類型。這種聲明變數的文法與聲明該變數所在的運算式的文法類似。同樣的原因,對函數的聲明也可以採用這種方式。例如,聲明:

  double *dp, atof(char *);

表明,在運算式中,*dp和atof(s)的值都是double類型,且atof的參數是一個指向char類型的參數。 

 

  我們應該注意,指標只能指向某種特定類型的對象,也就是說,每個指標都必須指向某種特定的資料類型。(一個例外情況是指向void類型的指標可以存放指向任何類型的指標,但它不能間接引用其自身。)。

 

  如果指標 ip 指向整形變數,那麼在 x 可以出現的任何上下文中都可以使用 *ip,因此,語句

  *ip = *ip + 10;

將把*ip的值增加10。

 

  一元運算子*和&的優先順序比算術運算子的優先順序高,因此,指派陳述式

  y = *ip + 1;

將把*ip指向的對象的值取出並加1,然後再將結果賦值給y,而下列指派陳述式:

  *ip += 1;

則將 ip 指向的對象的值加1,它等同於

  ++*ip;  

  (*ip)++;

語句的執行結果。 語句(*ip)++中的圓括弧是必須的,否則,該運算式將對 ip 進行加1運算,而不是對 ip 指向的對象進行加1運算,這是因為,類似於*和++這樣的一元運算子遵循從右至左的結合順序。

 

  最後說明一點,由於指標也是變數,所以在程式中可以直接使用,而不必通過間接引用的方法使用。例如,如果 iq 是另一個指向整形的指標,那麼語句

  iq = ip;

將把 ip 中的值拷貝到 iq 中,這樣,指標 iq 也將指向 ip 指向的對象。 

 

/*********************************

 * Last Edit By Old At 2009.12.26

 ********************************/ 

C程式設計語言_第2版新版.pdf  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.