指標
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...