傳值呼叫和傳址呼叫:
**實踐:
常量與指標(const修飾指標):
指標小結:
我們先提出乙個問題:既然程式中的變數只是一段儲存空間的別名,那麼是不是必須通過這個別名才能使用這段儲存空間?
#include
#include
intmain()
問題的答案很顯然,不是,可以通過指標來使用這段儲存空間。
指標在本質上也是乙個變數
指標需要占用一定的記憶體空間
指標用於儲存記憶體位址的值
在32位pc機上,指標占用的記憶體為4個位元組。(為什麼是4個位元組哪?指標需要具備儲存任意乙個位址的能力。)
在指標宣告時,*號表示所宣告的變數為指標;
在指標使用時,*號表示取指標所指向的記憶體空間中的值。
//指標宣告:
int i = 0;
int j = 1;
int* p = &i;
//取值
j = *p;
指標在記憶體中圖示:
* p就是:從0xaabbccd0的位址開始,取4個位元組的長度(int* p)。
#include
#include
intmain()
執行結果:
我們將上述**在windows系統上執行(本處使用devcpp的ide),多執行幾次,可以發現:
第一次執行:
連續執行多次,我們可以發現:int i變數的位址都為0x62fe44,我們現在利用windows系統的這一特性做乙個黑客操作(放開 注釋①)。
執行結果:
指標是變數,因此可以宣告指標引數
當乙個函式體內部需要改變實參的值,則需要使用指標引數
函式呼叫時實參值將複製到形參
指標適用於複雜資料型別作為引數的函式中
#include #include struct test
;void f(struct test t) //傳值:copy 2000*4 個位元組
int main()
#include #include struct test
;void f(struct test* t) //傳址:
int main()
通過巨集:
#include #include #define swap(a,b) //巨集是直接展開
int main()
實現了交換的功能
寫swap函式:(傳值呼叫)
#include #include void swap(int a, int b)
int main()
執行結果:
沒有實現了交換的功能
寫swap函式:傳址呼叫
#include #include void swap(int* a, int* b)
int main()
執行結果:
實現了交換的功能
const int* p; //p可變,p指向的內容不可變
int const* p; //p可變,p指向的內容不可變
int* const p; //p不可變,p指向的內容可變
const int* const p; //p和p指向的內容都不可變
口訣:當const出現在 * 號左邊時指標指向的資料為常量
當const出現在 * 後右邊時指標本身為常量
指標是c語言中一種特別的變數
指標所儲存的值是記憶體的位址
可以通過指標修改記憶體中的任意位址內容
圖示:
C語言之指標
指標型別的本質分析 1 指標的本質 指標的本質 一種復合的資料型別。下面我將以下面幾個作為例子進行展開分析 a int p b int p c int parvalue 3 d int pfun 分析 所謂的資料型別就是具有某種資料特徵的東東,比如資料型別char,它的資料特徵就是它所佔據的記憶體為...
C語言之指標
指標的概念 什麼是指標?如果用一句話概括的的話那就是,乙個存放記憶體空間位址的變數。指標也是乙個變數,指標存放的內容是乙個位址,該位址指向乙個記憶體空間。指標變數的定義 int p 該變數用來存放乙個空間的位址。p 代表該指標指所指向記憶體空間中的值,切記指標只能存放有效的記憶體空間位址,不能存放其...
C語言之指標
指標是c語言學習乙個重要的概念,它極大的方便了c語言程式設計,用好了指標可以幫助我們程式設計,但是同時指標也是飽受爭議,因為指標的使用很容易出錯,所以在一開始學的時候就弄懂有關指標的知識點是必要的。那麼指標是什麼呢?其實指標也是一種變數,和其他型別的變數一樣,也是儲存資料的,只是在指標變數裡面儲存的...