c指針深入理解--指針和函數
一、程序的栈和堆:
堆:
-》栈
-》程序栈
-》栈幀(组织)
-》函数返回地址
-》局部数据存储
-》参数存储
-》栈指针和基指针
1)栈指针:通常指向栈顶部
2)基指针:通常指向帧栈内部地址,比如函数返回地址、数组
-》?動態堆(自定義申請)
二、通過指針傳遞和返回數據:
-》传递数据:
1)指针传递
void swapWithPointers(int* pnum1, int* pnum2) {
int tmp;
tmp = *pnum1;
*pnum1 = *pnum2;
*pnum2 = tmp;
}
下面的代码段说明了这个函数的用法:
int main() {
int n1 = 5;
int n2 = 10;
swapWithPointers(&n1, &n2);
return 0;
}
2)数值传递:(普通传参方式)
3)传递指向常量的指针:(这种方式效率很高,因为只传了数据的地址,能避免某些情况下复制大量内存)
-》返回数据:
三、函數指針:
概念区别:
函数指针:强调的是指针,如 int (*fun)()
指针函数:强调的是函数,如 int *fun()
-》传递函数指针:
例子:
int (*func)( int num,int num2){};
int add( int num,int num2){};
int sub( int num,int num2){};
void op( func operation,int num,int num2 );
调用:
op( add, 2,3);
-》返回函数指针:
例子:
int (*func)( int num,int num2){};
int add( int num,int num2){};
int sub( int num,int num2){};
func select( char opcode);
switch(opcode) {
case '+':return add;
case '-':return subtract;
}
调用:
func op = select( add);
op( int num,int num2);
-》使用函数指针数组
例子:
typedef int (*fptrOperation)(int,int);
int add( int num,int num2){};
int sub( int num,int num2){};
typedef int (*func[128])( int num,int num2){};
void arr(){
func['+'] = add;
func['-'] = sub;
};
int evaluateArray(char opcode, int num1, int num2) {
fptrOperation operation;
operation = func[opcode];
return operation(num1, num2);
}
调用:
arr();
evaluateArray('+',5,6) ;