學過c語言的人都知道,指標是c語言中比較複雜難理解的乙個知識點,想要理解透徹有些難度,所以在此辨析一些容易混淆的概念,整理了有關指標的知識點。
首先,先來看幾個概念。
指標變數存放位址的變數。
變數指標:變數的位址。
所以,我們常常聽到定義乙個指標,實際上是定義乙個指標變數,而不是定義乙個指標,指標既然是位址,又怎麼能被定義呢?只不過我們口語中習慣與說定義乙個指標了而已。但是我們自己心裡一定要清楚定義的是指標變數。
那麼如何定義乙個指標呢?
int
*p;int a=10;
p=&a;
不難理解,有乙個變數a的值為10,有乙個指標變數叫p,p裡放著a的位址。通常我們也會說,p指向a。通過下圖可以清楚的看到。
char* pc=null;//char*型別的指標是為了存放char型別變數的位址
int* pi=null;//int*型別的指標是為了存放int型別變數的位址
short* ps=null;//short*型別的指標是為了存放short型別變數的位址
long* pl=null;
float* pf=null;
double* pd=null;
指標的型別決定了對指標解引用時有多大的許可權。比如:char*的指標解引用就只能訪問乙個位元組,int*的指標解引用可以訪問4個位元組。
如何使用指標?
一般我們使用*即解引用。
int
*p;int a=10;
p=&a;
*p=20;
此時,我們就通過對指標解引用找到了a,並且修改了a的內容。這個*好像就是一把鑰匙一樣,你拿著這把鑰匙去匹配乙個指標變數,就能通過這個鑰匙和指標變數找到記憶體的內容。
之前學過了陣列,我們知道,陣列是一些相同元素型別的集合。
int arr=;
畫圖示意:
編譯器會根據元素個數和元素型別來開闢空間的,比如上例會開闢20個位元組的大小。
答案是:沒有關係
我們常常會看到一些書上寫陣列就是指標,這種說法是不合理的。
實際上,陣列是陣列,指標是指標,他們之間是沒有關係的。
那麼為什麼會將他們混淆,原因是因為我們在使用時,陣列和指標可以達到同樣的目的。以兩個例子來說明。
char *p="abcdef";
經過分析,p是乙個指標變數,裡面儲存了a的位址,這裡需要注意一點,這裡的指標p在棧上,而abcdef字串在字元常量區。
我們使用下標和指標兩種方式訪問,比如我們要訪問字元『c』
下標形式訪問:p[2]:這種形式實際上編譯器也會把他當成指標形式來操作,取出p中儲存的位址,即就是a的位址,然後加上括號裡2個元素的偏移,得到乙個新的位址,就是c的位址,此時就可以訪問c。
char arr="abcdef";
與上例不同的是,此時是乙個字元陣列,每乙個字元都被儲存在棧上,連續存放。
int *arr[10];//指標陣列
char *arr[4];//字元指標陣列
char**arr[5];//二級指標陣列
int (*p)[10];//陣列指標
如何區分?
優先順序,通俗來說,p先和誰結合誰結合就是什麼。
這裡要注意:【】的優先順序要高於*號,如果是指標就要加上()來保證p先和星號*結合。可以通過上面的例子看到,arr先和【】結合,所以是陣列,arr先和星號結合,所以是指標。
畫圖說明,指標陣列與陣列指標的區別。
之前我們學過了函式調堆疊用時知道在函式呼叫時,函式也是有入口位址的。既然是位址,那麼我們就可以用指標來儲存。
函式指標
如何判斷:
void (*pfun1)();//函式指標
void *pfun2();//函式
同樣考慮優先順序,先和星號結合就是指標。
(*(void (*)())0)();
那麼這個如何判斷?
分析:1,void(*)(),這是乙個void型別的函式指標,返回值為空,引數也為空。
2,(void(*)())0,對0進行強制型別轉換成函式指標的型別,即將函式儲存在首位址為0的某段區域。
3,(* (void(*)())0),對位址解引用,取得首位址為0的區域的內容,即儲存在那段區域的函式。
4,(* (void (*)())0)(),對函式進行呼叫,引數為空。
函式指標陣列
int (*parr[10])();//函式指標陣列
同樣是用優先順序判斷,先於結合,所以是陣列。
char *(* p
[3])();
這是乙個函式指標陣列,首先它是有3個元素的乙個陣列,裡面存放的是指向函式的指標。
函式指標陣列的指標
char *(*(*p)[3])(char *);//函式指標陣列的指標
同樣你可以用優先順序判斷,先於星號結合,所以它是指標,指標指向乙個有3個元素的陣列,每個元素都是乙個函式指標。 c指標陣列與陣列指標與指標函式與函式指標筆記
include include typedef struct t ooxx t ooxx,pt ooxx 測試陣列指標 void test ooxx arrayp t ooxx p int num 測試指標陣列 void test ooxx parray t ooxx p,int num 測試函式指...
C語言指標 指標與陣列
1 指標與一維陣列 2 指標與二維陣列 3 指標陣列與陣列指標 指標裡面最難的一種就是指標與陣列了,對於指標和二維陣列來說這裡面的關係比較複雜。牽涉到編譯器的原理和編譯過程。1 指標與一維陣列 指標是指向乙個記憶體的位址,一維陣列的陣列名代表一塊記憶體 這個陣列 的首位址,和陣列首元素的位址一樣,但...
C語言指標 指標與陣列
一 指標的運算 指標可以進行三種運算 1.指標加上整數 如果指標p指向陣列a i 那麼指標p j 指向a i j 前提是a i j 存在!2.指標減去整數 如果指標p指向陣列a i 那麼指標p j 指向a i j 前提 a i j 存在!3.兩個指標相加減 兩指標必須指向同一變數!否則運算沒有意義的...