第八章 地址和指針

第八章 地址和指針

1.變量的地址和指針

一個變量實質上是代表了“內存中的某個存儲單元”;計算機的內存是以字節爲單位的一片連續的存儲空間,每一個字節都有一個編號,這個編號就稱爲內存地址。因爲內存的存儲空間是連續的,所以內存中的地址號也是連續的,並且用二進制來表示。每個變量的地址是指該變量所佔存儲單元的第一個字節的地址(如a的地址爲1012)。
a 變量
(1)直接存取:程序中我們對變量進行存取操作,實際上就是對某個地址的存儲單元進行操作。
指針變量:存放地址的變量
(2)間接存取:變量p有自己的地址(2002),若將變量a的內存地址(1012)存放到變量p中,這時要訪問變量a所代表的存儲單元,可以先找到變量p的地址,從中取出變量a的地址,然後再去訪問以1012爲首地址的存儲單元。如下圖所示,指針變量p指向變量a
間接存儲

2.指針變量的定義和指針變量的基類型

定義指針:類型名 *指針變量名1,*指針變量名2,……;
例如: int *pi,pj;
每個變量前的星號
是一個說明符,用來說明該變量是指針變量,注意:變量前的星號不可省略;例子中int是pi和pj指針的基類型,只能存放int類型變量的地址。

int   **p,*s,k=20;
s=&k;  p=&s;

這裏定義的p爲一個指向指針的指針變量,“&”是求地址運算符,s=&k用來求出整型變量k的地址賦給指針變量s,而使s指向k;
一個指針變量中存放的是一個存儲單元的地址值,指針移動的最小單位是一個存儲單元,而不是一個字節。

3.給指針變量賦值

指針變量=&變量; 如p=&k;
求地址運算符只能應用於變量和數組,不可以用於表達式、常量或者被說明爲register的變量。
在調用scanf函數時,輸入的各變量之前都必須加符號&,這就是求地址運算,如scanf(格式控制,指針變量);scanf(“%d”,p);

在這裏插入圖片描述

給指針賦“空”值:p=NULL;或p=’\0’;或p=0;(NULL是在stdio.h頭文件中定義的預定義符)

4.對指針變量的操作

間接訪問運算符(也稱間址運算符)“”,當指針變量中存放了一個確切的地址時,就可以用“”通過指針來引用該地址的存儲單元。
例如:int p,i=10,j;
P=&I;則賦值語句:j=p;
等價於j=I;
間接訪問運算符是一個單目運算符,其運算對象或者是存放地址的指針變量,或者是地址,如:j=
(&i);
“&”和“
”都是自右向左結合。
移動指針:當指針指向一串連續的存儲單元時,可以對指針變量進行加上或者減去一個整數的運算,也可以對指向同一串連續存儲單元的兩個指針進行相減運算。
指針移動
q=p+2; /是指針q指向存儲單元a[2]/
q++; /向高地址移動指針q,使指針q指向存儲單元a【3】/
q++; /向高地址移動指針q,使指針q指向存儲單元a【4】/
q–; /使指針q向低地址移動,指針q指向存儲單元a【3】/
p++; /向高地址移動指針p,使指針p指向存儲單元a【1】/
5.函數之間地址值的傳遞
若函數的形參爲指針類型,調用該函數時,對應的實參必須是基類型相同的地址值或者是已指向某個存儲單元的指針變量。,利用指針可以改變實參的值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章