#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#define LEN 10
using namespace std;
int Sum(int a, int b)
{
return a + b;
}
//每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里
//函数指针1:
int(*FnName)(int,int);//声明一个函数指针
//函数指针2:
typedef int(*FnType)(int, int);
int Fun1(FnType ft, int x, int y)
{
return (*ft)(x,y);
}
//成员函数指针:
class Num
{
public:
Num(){ n_ = 0; }
void Inc(int n);
void Dec(int n);
static int Sub(int a,int b);
private:
long n_;
};
void Num::Inc(int n)
{
n = n + 1;
cout << n << endl;
}
void Num::Dec(int n)
{
n = n - 1;
cout << n << endl;
}
int Num::Sub(int a, int b)
{
return (a + b);
}
//指向虚函数的指针
//虚函数的指针指向的函数地址是对象动态绑定的函数地址
class Base
{
public:
virtual void F() const
{
cout << "I am the Base\n";
}
typedef void (Base::*FnPtr)() const;
};
class Derived : public Base{
public:
virtual void F() const
{
cout << "I am the Derived\n";
}
};
int main()
{
//指针基础
cout << "\n指针基础:" << endl;
int a = 12;
int b;
int *p;
int **ptr;
p = &a; //&a 的结果是一个指针,类型是int*,指向的类型是
//int,指向的地址是a 的地址。
*p = 24; //*p 的结果,在这里它的类型是int,它所占用的地址是
//p 所指向的地址,显然,*p 就是变量a。
ptr = &p; //&p 的结果是个指针,该指针的类型是p 的类型加个*,
//在这里是int **。该指针所指向的类型是p 的类型,这
//里是int*。该指针所指向的地址就是指针p 自己的地址。
*ptr = &b; //*ptr 是个指针,&b 的结果也是个指针,且这两个指针
//的类型和所指向的类型是一样的,所以用&b 来给*ptr 赋
//值就是毫无问题的了。
**ptr = 34; //*ptr 的结果是ptr 所指向的东西,在这里是一个指针,
//对这个指针再做一次*运算,结果是一个int 类型的变量。
//指针算数运算
cout << a << endl;
cout << p << endl;
cout << *p << endl;
cout << ptr << endl;
cout << *ptr << endl;
cout << **ptr << endl;
//指针和数组
cout << "\n指针和数组:" << endl;
int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int value1,value2,value3;
value1 = array[0]; //也可写成:value=*array;
value2 = array[3]; //也可写成:value=*(array+3);
value3 = array[4]; //也可写成:value=*(array+4);
cout << value1 << endl;
cout << value2 << endl;
cout << value3 << endl;
char *str[3] = {
"Hello,thisisasample!",
"Hi,goodmorning.",
"Helloworld"
};
char s[80];
strcpy(s, str[0]); //也可写成strcpy(s,*str);*(str+1)也是一个指针,它的类型是char*,它所指向的类型是char,它指向"Hi,goodmorning."的第一个字符'H'
cout << s << endl;
strcpy(s, str[1]); //也可写成strcpy(s,*(str+1));
cout << s << endl;
strcpy(s, str[2]); //也可写成strcpy(s,*(str+2));
cout << s << endl;
//指针数组大小
cout << "\n指针数组大小:" << endl;
cout <<"sizeof(int(*)[10]) 的大小是:"<< sizeof(int(*)[10]) << endl;
cout << "sizeof(int[10]) 的大小是:" << sizeof(int[10]) << endl;
cout << "\n指针算数运算:"<< endl;
int array1[5]={0,1,2,3,4};
int *ptr1 = array1;
for (int i = 0; i<5; i++)
{
(*ptr1)++;//组中各个单元的值加1
cout << (*ptr1) << endl;
ptr1++;//地址+sizeof(int)
}
cout << "\n函数指针:" << endl;
//函数指针:
FnName = ∑// 将Sum函数的地址赋给它 ,Sum函数指针赋给它,注意,只有两个函数指针参数类型,返回值类型完全相同才可以赋值,注意修饰符const,&等不同也会导致赋值失败
cout<<(*FnName)(3,5)<<endl;//等价于Sum(3,5)调用格式:(*函数指针变量)(实参列表);
cout << Fun1(&Sum, 1, 2) << endl;
cout << "\n成员函数指针:" << endl;
//成员函数指针
Num iNum;
void(Num::*mf)(int);//声明指向成员函数的指针 mf
mf = &Num::Inc;
(iNum.*mf)(1);
typedef void(Num::*mt)(int);
mt fn = &Num::Dec;
(iNum.*fn)(2);
int(*smf)(int a,int b);
smf = &Num::Sub;
cout << (*smf)(6,7)<<endl;
cout << "\n指向虚函数的指针:" << endl;
指向虚函数的指针
Base::FnPtr fp = &Base::F;
Base base;
(base.*fp)();
Derived derived;
(derived.*fp)();
getchar();
return 0;
}