第八章 指標

2022-08-27 05:09:12 字數 3998 閱讀 5857

指標

1,指標

指標,英文名是pointer,也叫位址,他是常量。他就是乙個記憶體空間的首位置。

2,指標變數,(位址變數)

顧名思義,指標變數就是存放指標(位址)的變數。如果定義呢?

short int * p = null;   //定義了乙個指標變數p,並且付給初始值為零。

// short int * 就是型別。表示的是存放short int型記憶體塊的位址的。

// p就是變數名。

//付給初始值為零,零表示不是任何記憶體塊的位址。或者稱p為空指標

//在32位系統下,所有的指標(位址)變數,都是四個位元組。

//我們把乙個位址賦值給乙個指標變數,我們就說,指標變數指向了該記憶體塊(變數)

3,*p的含義:這裡的* 是運算子,取值運算子。

*p的含義,根據p裡的位址,找對應型別的記憶體塊。

如果p 的值為0,*p找不到記憶體,就會崩潰。

如果p 是亂值, 就會崩潰。

所以,未經初始化的變數是禁止使用的。

4,p + n 的含義(位址加上乙個整型數的意思)

含義是:p這個位址向右移動n個儲存單元(是p指向的記憶體單元),得到乙個新的位址。

p[n],含義是p位址後第n+1個儲存單元(記憶體塊)。

由此得出,兩個指標相減,等於間隔的記憶體塊的個數。

兩個位址不能相加。

5, 指標可以進行關係運算的。(在連續空間內比較才有意義)

例如,> >=,

1、指標的基本概念

(2)從零開始的非負整數

(3)4g

(2)指標變數就是存放記憶體單元編號的變數,指標變數就是存放位址的變數

(3)指標和指標變數是兩個不同的概念  

(4)指標的本質是乙個操作受限的非負整數

格式:  型別說明符 *指標變數名 ;       (指標變數的型別, 是指標所指向的變數的型別,  而不是自身的型別)

示例: #include

int main()

指標變數的引用、

取位址運算子── 「&」  

引用運算子 ── 「*」

說明:     *p  對應型別記憶體塊

2、指標變數的運算

(1)指標變數不能相加,不能相乘,不能相除

(2)如果兩個指標變數指向的是同一塊連續空間中的不同儲存單元,則這兩個指標變數可以相減。

3.指標與函式

通過被調函式修改主調函式變數的值,實現函式返回乙個以上的值;

(1)實參必須是該普通變數的位址

(2)形參必須是指標變數

(3)在被調函式中可以通過 * 形參名=……的方式,修改主調函式相關變數的值。

示例:#include

void func ( inr * p , int * q )

int main()

3.指標和陣列

指標和一維陣列

(1)一維陣列名是個指標常量

(2)它存放的是一維陣列第乙個元素的位址 

指標和下標的關係

(1)如果 p 是個指標變數,則 p [ i ] 永遠等價於 * (p + i) 

(2)確定乙個一維陣列需要兩個引數(陣列位址和引數個數)

動態記憶體分配

1、傳統陣列缺點

(1)陣列長度必須事先指定,且只能是常整數,不能是變數

(2)傳統形式定義的陣列,該陣列的記憶體程式設計師無法手動釋放,直到函式執行結束,系統自動釋放。

(3)陣列長度一旦定義,其長度就不能更改;

(4)傳統方式定義的陣列不能跨函式使用

動態分配記憶體可以很好地解決傳統陣列的缺點

2、malloc函式(memory  allocate)

int * p =( int  * ) malloc ( sizeof ( int ));

(1)必須新增標頭檔案 malloc . h

(2)只有乙個形參,並且形參為正數

(3)返回值為分配記憶體的第乙個位元組的位址;

(4)free(變數)手動釋放分配的空間

(5)free能釋放malloc分配的動態記憶體,不能釋放 int * p 分配的靜態記憶體;

指標應用。

(1)我現在想要模組化程式設計,寫函式,寫乙個函式來實現兩個數的交換。

方法一

#include

void swap(int a,int b)

void main()

上面的傳遞方式,我們叫他數值傳遞,因為值傳遞實參和形參是不同的記憶體,所以無法改變主調函式變數的值。

結論,值傳遞不可能改變主調函式變數的值。

方法二

include

void swap(int * a,int * b)//呼叫時後,a的值為(4000)b的值為(5000)

void main()

方法三

#include

void swap(int * a,int * b)//呼叫時後,a的值為(4000)//b的值為(5000)

void main()

方法四#include

void swap(int * a,int * b)//呼叫時後,a的值為(4000)b的值為(5000)

void main()

三種方法的比較,有的方法可以實現,有的方法實現不了,為什麼?

(2)第二題

char * get_usr_str()

;//區域性變數,陣列。mystr是陣列名,他是記憶體塊(mystr[0])的首位址。我們可以假設這個位址是(4000).

printf("請輸入您的字串:\n");

scanf("%s",mystr);//%s 按字串的方式來讀取,讀取內容,放到mystr(4000)位址開始的記憶體塊中。

return mystr;//把(4000)這個位址值返回了。

}char * get_usr_str1()

void main()

第八章 指標 第八章 指標

1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...

第八章 指標

1 8.3.1 指標基礎及指標運算 2 8.3.2 資料交換 3 8.3.3 字串反轉及字串連線 4 8.3.4 陣列元素奇偶排列 1 掌握指標的概念和定義方法。2 掌握指標的操作符和指標的運算。3 掌握指標與陣列的關係。4 掌握指標與字串的關係。5 熟悉指標作為函式的引數以及返回指標的函式。6 了...

第八章 指標實驗

1 問題的簡單描述 流程圖如下 2 實驗 includeint main 輸出結果 3 問題分析 無。1 問題的簡單描述 流程圖如下 2 實驗 includevoid swap1 int x,int y void swap2 int x,int y int main void swap1 int x...