4)C語言指標(C自考學習)

來源:互聯網
上載者:User

標籤:nbsp   分享   儲存空間   儲存   定義   個數   數組元素   不同的   計算   

指標和指標變數

  指標就是地址,地址是一種資料類型。指標變數也是變數,但只能存放地址類型的資料,可以稱為“地址型”變數。

  1)記憶體單元和地址

  一個程式運行時,程式本身和程式中用到的資料都要儲存在電腦的內部儲存空間中。內部儲存空間是由多個記憶體單元(位元組)組成的,每個單元都有自己專屬的,相互不同的地址,稱記憶體單元地址。

  2)變數與地址。

  char ch=‘A‘;   short s =5;  float f;    他們分別是1個位元組,2個位元組,4個位元組。(也就是記憶體單元)

  如果出現這樣的指派陳述式“f=s+ch;”,操作過程是:

  1.在變數地址對照表中找到變數a,取出s的地址(2010),考慮到其資料類型是短整型,所以從該地址開始的2個位元組中取出1個整數(5);

  2。根據同樣的方法去除變數ch中的字元‘A’(想當於整數65),相加獲得運算式的值為70.

  3.然後再變數與地址對照表中找到變數f的地址,考慮到其資料是單精確度型,所以將結果70轉換成單精確度實行的70.0,再存入變數f對應的4個位元組中。

  以上操作,通過變數名查取變數的地址,再從變數對應地址的位元組中取得值或將某值存入變數對應地址的位元組中稱為直接存取方式,由於地址能起到尋找“操作隊形”的作用,就像一個指向“操作對象”的指標,所以常把地址稱為“指標”。

  3)數組與地址

  除了變數以外,程式中還可以用數組來存放資料。每個數組元素也要佔用連續的記憶體單元。一個數組佔用的總位元組數等於數組長度乘以每個數組元素佔用的位元組數。

  在來源程式進行編譯時間,每遇到一個數組,按其資料類型和長度分配記憶體單元,同時在“數組與地址對照表”中記錄數組名、資料類型、數組長度、數組首地址。

  例如這個語句  short a[3]={1,2,3};

  

 

  在數組地址對照表中找到數組a,取出首地址,按公式計算出數組元素a[0]的地址:3210+0*2=3210,從該地址開始的2個位元組(3210、3211)中取出整數1;按相同的方法取出數組元素a[2](地址是3210+2*2=3214)中的整數3,進行相加,得到結果4.然後通過公式計算出a[1]的地址:3210+1*2=3212,再將計算結果4存入3212開始的2個位元組(3212、3213)中。上述操作中,通過查表獲得數組首地址,通過計算元素地址的方式先獲得元素的地址,然後通過這個地址取得元素的值,或將值存入元素的方式也是直接存取方式。

  4)指標變數

  先把要存取的變數的地址存入一個“特殊變數”,然後通過這個其值為地址的“特殊變數”來存取變數的值,這種存取方式由於通過一種存放地址的“特殊變數”來實現的,所以稱為間接存取方式。

  這種存放地址值的“特殊變數”就是指標變數。

  使用指標變數:

  通過間接存取方式完成指派陳述式“a[1]=i*j;”的操作。事先將變數i、j和數組元素a[1]的地址分別存入指標變數p_i、p_j、p。以後的操作過程如下:先從指標變數p_i中取出i的地址,再從記憶體該地址中取出變數i的值;按同樣方法,通過指標變數p_j取出變數j的值進行相乘;再從指標變數p中取出數組元素a[1]的地址,將運算結果存入記憶體的該地址中。

指標變數的使用方式

  1)給指標變數賦值

    格式為:指標變數=地址型運算式。

    取地址的運算子是“&”,運算對象是變數或數組元素名,運算結果是對應變數或數組元素的地址。

    例如:變數 i 的地址應寫成地址運算式“&i”,數組元素a[1]的地址應寫成地址運算式“&a[1]”。

    注意:雖然地址是一個整數,但是,在C語言中不允許把整數看成“地址常量”。所以這的“地址型運算式”不能是整數。

    例如:int i , *p_i

    p_i = &i //使指標變數p_i指向變數i,這的&i 就是地址型運算式。

    p_i = 100;  //企圖使指標變數p_i指向地址為100的記憶體單元,這是錯誤的。

  2)直接使用指標變數名。

    需要用到地址時,可以直接引用指標變數名。

    例如:int i,j, *p=&i,*q;

    q=p;  //將指標變數p的值(i的地址)賦予指標變數q。

    scanf("%d,%d",q,&j);  //使用指標變數q接受輸入資料存入q指向的變數i。

  3)通過指標變數來引用它所指向的變數。

    使用格式為:*指標變數名。

    例如:int i =1,j=2,k,*p=&i;

    k=*p+j; //由於p指向i,所以*p就代表i,結果k等於3.

  注意:取地址運算子的運算對象必須是已定義過的變數或數組元素,但不可以是數組名。運算結果是運算對象的地址。例如,定義了變數a,數組b[10],則&a,&b[0],&b[9]均合法,分別代表變數a地址,數組元素b[0]的地址,數組元素b[9]的地址;而&b則是錯誤的。

  (未完。。。。)

4)C語言指標(C自考學習)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.