C++ 指针 总结

#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函数的地址赋给它 ,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;
}
posted @ 2019-03-26 13:44  Kiris  阅读(13)  评论(0)    收藏  举报