close
C 語言指標的用法
在C語言中,最令人頭疼的地方可能是指標的觀念了。如果沒有了指標,則C將失去它的威力,想弄懂它卻又需要一些功夫。
在指標中又屬函式指標最不常用到,我們來宣告一下函式及函式指標,以便看看它們之間的差異及互相的關係:
long MyFun(int a, int b); // 這是函式
long (*MyFunPt)(int a, int b); // 這是函式指標
再看看下面這個範例:
/* ****************************************
Filename: p1_01.cpp
Author: Lin Jeng-Yi
函數指標的使用方法
****************************************** */
#include <iostream.h>
#include <stdlib.h>
long add_em(int a, int b)
{
return((a+b));
}
long (*math)(int a, int b); // 函數指標
double (*flog)(double x); // 函數指標
void main()
{
math = add_em; // 指向自定函數
flog = log; // 指向庫存函數
cout << (*math)(12,10);
cout << 'n';
cout << (*flog)(8.6);
}
程 式 p1_01.cpp 的 執 行 結 果 如 下 :
22
2.15176
事 實 上 , 函 式 只 是 一 連 串 指 令 的 進 入 點 , 函 式 指 標 則 記 錄 著 這 個 進 入 點 的 位 址 , 所 以 , 如 果 參 照 (reference) 到 一 個 函 式 指 標 時 , 則 相 當 於 呼 叫 這 個 函 式 。
既 然 已 經 知 道 函 式 指 標 的 使 用 方 法 了 , 讓 我 們 再 試 試 函 式 指 標 陣 列 的 用 法 :
long Fun1(int a, int b)
{
return (a+b);
}
long Fun2(int a, int b)
{
return ((a+b)*2);
}
long Fun3(int a, int b)
{
return (a*2 + b);
}
long (*math[3])(int a, int b); // 宣告一個陣列
// 內部可存放3個函式指標
void main()
{
math[0] = Fun1;
math[1] = Fun2;
mayh[2] = Fun3;
cout << (*math[0])(10,20) << 'n';
cout << (*math[1])(10,20) << 'n';
cout << (*math[2])(10,20) << 'n';
}
您 應 該 知 道 這 個 範 例 的 結 果 了 !
您可以說明下列式子各代表什麼含意嗎?
1. int* pi; /*定義一個指向int型態資料的指標變數pi*/
2. char** cpp; /*定義一個指向char型態資料的指標的指標變數cpp*/
3. int (*vp)[10]; /*定義一個指向int型態陣列資料的指標vp; 通常用 "指向陣列vp第一元素的指標"*/
4. int* v[10]; /*定義一個指向int型態資料的指標陣列v*/
5. int (*fp)(char a, char* b); /*定義一個指向傳回int型態資料的函式的指標; fp為指向int函數的指標變數*/
剖析要訣是 : 由右至左,由內向外來解讀
char **argv : 指向 char 型態資料的指標陣列argv;pointer to char
int (*daytab)[13] : 指向陣列[13]的整數型態變數(整數型態的陣列[13]指標);pointer to array[13] of int
int *daytab[13] : 指向整數型態的陣列[13](整數指標型態的陣列);array[13] of pointer to int
void *comp() : 傳回指向void型態的函式(或傳回void型態指標的函式);function returning pointer to void
void (*comp)() : 指向傳回void型態的函式(或傳回void型態的函式指標);pointer to function returning void
char (*(*x())[])() :
x : 指向傳回 char 型態的函式,且此函式是指向函式陣列[]的傳回值(或取得指向『傳回字元型態的函式指標』的陣列[]之函式);function returning pointer to array[] of pointer to function returning char
char (*(*x[3])())[5] :
x : 傳回『char 型態的陣列[5]指標』的函式指標陣列[3];array[3] of pointer to function returning pointer to array[5] of char
註 : 此處『取得』和『傳回:returning』是同義的,僅為方便描述之措辭
指標函式的用途:
static int f(void);
int (*pf)(void)=&f; /* 將f()的位址值指定給pf()函數函數指標*/
Pointers (指標)
& operator (address of)
* operator (indirection)
--------------------------------------------------------------------------------
Ex.: 請分別以 C 及 C++ 實作 (implement) 出 swap(a, b) 函式 將兩數字交換.
in C (Wrong!)
in C (using Pointers)
in C++ (using Reference)
--------------------------------------------------------------------------------
Call by Value: 傳入的值不需要傳回來
Call by Reference: 傳入的值需要傳回來
--------------------------------------------------------------------------------
Pointers and Arrays
char *p <==> char p[]
char **pp <==> char pp[][]
--------------------------------------------------------------------------------
More (Confusing) Examples on Pointers
Arrays (陣列)
char a[100][80];
Pointer to Arrays (指向陣列的指標): 通常用 "指向陣列第一元素的指標" 即可
char (*ap)[100];
Array of Pointers (指標陣列)
char *pa[100];
Pointer to Pointers (指向指標的指標): main() 之參數 char **argv , Word Processor, ...
char **pp;
Pointer to structs (指向結構的指標): 傳參數
struct *s;
Pointer to Functions (指向函式的指標): Drivers, ISR (Interrupt Service Routine), TSR (Terminate and Stay Resident), ...
void (*fp)(...);
--------------------------------------------------------------------------------
Notes on Pointers (注意事項)
Initialization and Destruction
NULL pointer: 未 initialize 就使用
Dangling pointer: 使用後, 未清除掉
Ex.: memory allocation and deallocation (動態配置與釋放記憶體):
In C :
char *p, v;
p = malloc(100);
...
v = p[i]
...
free(p);
In C++:
char *p, v;
// new (配置記憶體) 前, 不可使用 p!
p = new char[100];
...
v = p[i]
...
delete p;
// delete (釋放記憶體) 後, 不可使用 p!
Vulnerable and Dangerous!
一旦取得 pointer p, 就可任意存取 p 所指的任何東西
全站熱搜
留言列表