/*变量指针,函数指针
*/
#include <iostream>
using
namespace
std;
//做函数声明,函数的实现可以在调用的后面,但是声明必须在调用的前面
int
add(
int
,
int
);
int
mutiple(
int
,
int
);
int
doOperate(
int
a,
int
b,
int
(*opImp)(
int
,
int
));
int
main(
void
){
//声明一个变量
int
var = 100000;
//输出变量的值
cout<<
"var's value = "
<<var<<endl;
//变量在内存中存储,每一个变量都有一个地址
//通过&符号即可取得变量的地址
cout<<
"var's address = "
<<&var<<endl;
//取得地址的中存放数据的值,这儿应该输出1000
//&var表示var变量的地址,*(&var)表示取出地址中的数值
cout<<*(&var)<<endl;
//声明指针型变量
//下面的星号和上面的型号意思不同,上面的型号表示取出地址对应变量的值
//而这里的*表示声明int类型的指针变量,intPointer是一个指针变量
int
* intPointer;
int
i=1000;
intPointer = &i;
//下面将输出变量i的地址的值
cout<<
"intPointer = "
<<intPointer<<endl;
//下面将输出变量i的值
cout<<
"intPointer's variable value = "
<<*intPointer<<endl;
//可以通过指针赋值
*intPointer = 999;
//现在a的值是999
cout<<
"intPointer's variable value = "
<<*intPointer<<endl;
//但是不能用程序修改intPointer的值,下面一行代码是不允许的
//intPointer = 9999999;
//可以将指针指向另外一个变量
int
anotherVar = 987;
intPointer = &anotherVar;
//指针和数组的关系
//这个数组的声明方式和c#中不同c#是int[] intArray = ..
int
intArr[] = {1,2,3,4,5,6};
//现在可以将intArr赋给intPointer
//现在intPointer是指向数组的第一个元素
intPointer = intArr;
//给数组的第三个元素赋值10
*(intPointer+2)=10;
//也可写成intPointer[2] = 10;
//和下面语句是等价的
//intArr[2] = 10;
cout<<
"intArr[2] = "
<<intArr[2]<<endl;
//指针的指针可以多加一个*号
//指针本身也是一个变量需要在内存中存储,所以就有了指针的指针
int
** pp = &intPointer;
//函数指针
//和c#的委托差不多了
int
sum = doOperate(1,2,add);
cout<<
"sum="
<<sum<<endl;
int
mut = doOperate(1,2,mutiple);
cout<<
"mut="
<<mut<<endl;
}
//声明函数指针的语法 返回值类型 (*变量名)(参数值类型1[,参数值类型2])
int
doOperate(
int
a,
int
b,
int
(*opImp)(
int
,
int
)){
return
(*opImp)(a,b);
}
int
add(
int
a,
int
b){
return
a+b;
}
int
mutiple(
int
a ,
int
b){
return
a*b;
}