1. 程式人生 > >C++漸習記--(4)函式指標

C++漸習記--(4)函式指標

c++指標博大精深,氣宇軒昂,不是你我一朝一夕所能理解的,也是咱們一兩篇文章所能講透徹的,邊學邊寫邊理解,切忌,程式碼一定要自己敲出來,才能理解透徹。

1. 指標引數

    形參為指標,當對形參進行操作的時候,也相當於對實參操作

void changefunc(int *n)
{
	*n = *n + 1;
}

於值傳遞,指標傳遞,引用傳遞這幾個方面還會存在誤區;

值傳遞:

形參是實參的拷貝,改變形參的值並不會影響外部實參的值。從被呼叫函式的角度來說,值傳遞是單向的(實參->形參),引數的值只能傳入,不能傳出。當函式內部需要修改引數,並且不希望這個改變影響呼叫者時,採用值傳遞。

指標傳遞:

形參為指向實參地址的指標,當對形參的指向操作時,就相當於對實參本身進行的操作

引用傳遞:

形參相當於是實參的"別名",對形參的操作其實就是對實參的操作,在引用傳遞過程中,被調函式的形式引數雖然也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的地址。被調函式對形參的任何操作都被處理成間接定址,即通過棧中存放的地址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。

2. 函式指標

    函式存放在記憶體中的程式碼區域,同樣也是有指標的,函式指標的地址就是函式的名字,例如 int test(int a) ,指標地址就是test

    函式指標定義有引數和返回值 

  int (*fp)(int a);

    

// ConsoleApplication1.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include<string>
#include<iostream>
using namespace std;

void changefunc(int *n);

int test(int a);
int _tmain(int argc, _TCHAR* argv[])
{
	cout << "-----------------"<<endl;

	//int a = 10;//定義變數
	//int *p = &a; //定義指標P
	////在此要說明一點, p指的是地址,*p指的是地址中儲存的值
	//cout << "a:" <<a<< endl;
	//cout << "&a:" << &a << endl;
	//cout << "p:" << p << endl;
	//cout << "*p:" << *p << endl;
	//cout << "&*p:" << &*p << endl;

	cout << "指標引數" << endl;
	int m = 10;
	cout << "改變前m:" << m << "--&m" <<&m<< endl;
	changefunc(&m);
	cout << "改變後m:" << m << "--&m" << &m << endl;
	//發現傳值後值變了,地址沒有變
   cout<< "-----------------"<<endl;

   cout << "函式指標" << endl;
   cout << "-----------------" << endl;
   int(*f)(int a);
   f = test;
   cout << "返回值:" <<f(3)<< endl;
   cout << "-----------------" << endl;

	system("pause");

	return 0;
}

void changefunc(int *n)
{
	*n = *n + 1;
}

int test(int a)
{
	a = a + 1;

	return a;
}