第二十五章补充内容 15再谈指针

// 第二十五章补充内容 15再谈指针

// 15.1 指针与数组

/*#include <iostream>

using namespace std;

int main()

{

	int ch[2][3] = {

		{0,1,2},

		{10,11,12}

	};

	int *p1 = &ch[1][2]; //指向12的地址

	int *p2 = ch[1] + 2; //指向3的地址,也就是第四个元素的地址

	//最先的理解是错的,char[1]也就是第个行的数据,然后加1,不就是ch[1][2] 12

	int *p3 = ch[0]; //0

	int *p4 = ch[1]; //10

	cout<<*p1<<endl;

	cout<<*p2<<endl;

	cout<<*p3<<endl;

	cout<<*p4<<endl;

    return 0;

}*/



/*#include <iostream>

using namespace std;

int main()

{

	int a[3][4]={

		{1,2,3,4},

		{11,22,33,44},

		{111,222,333,444}

	};

	cout<<a<<" "<<*a<<" "<<a[0][0]<<endl;       //1

	cout<<a[0]<<" "<<*(a+0)<<" "<<a[0][0]<<endl;//1

	cout<<&a[0]<<" "<<&a[0][0]<<" "<<a[0][0]<<endl; //1

	cout<<a[1]<<" "<<a+1<<" "<<a[1][0]<<endl; //11

	cout<<&a[1][0]<<" "<<*(a+1)+0<<endl; //11

	cout<<a[2]<<" "<<*(a+2)<<endl; //111

	cout<<&a[2]<<" "<<a+2<<endl; //2

	cout<<a[1][0]<<" "<<*(*(a+1)+0)<<endl; //11



    return 0;

}*/



//15.2 指针操作多维数组

/*

#include <iostream>

using namespace std;

int main()

{

	int a[3][4]={

		{1,2,3,4},

		{11,22,33,44},

		{111,222,333,444}

	};

	int *p;

	for(p=a[0]; p<=a[0]+12; p++)

	//for(p=a[0]; p<=&a[2][3]; p++)

	{

		//cout<<"p:"<<*p<<endl;

		//cout<<"a[0][0]:"<<a[0][0]<<endl;

		//if( ((*p)-(a[0][0])) % 4 == 0)

		cout<<"p:"<<p<<" a[0]:"<<a[0]<<" p-a[0]:"<<(p-a[0])<<endl; //这里是内存地址的移动

		if((p-a[0]) % 4 == 0)

		{

		   cout<<endl;

		}

	   cout<<*p<<endl;

	}

    return 0;

}*/



/*#include <iostream>

using namespace std;

int main()

{

	int a[3][4]={

		{1,2,3,4},

		{11,22,33,44},

		{111,222,333,444}

	};

	int (*p)[4], i, j; 

	//注意int(*p)[4]; 其中的p是一个指针,它指向一个具有四个元素的一维数组,由于方括号[]的级别高于*,因此*p用小括号括了起来,

	//表示它的级别要高于方括号,



	//int *p[4]; 那么它表示的是一个具有4个指针的指针数组p





	p = a; //这里p是针a[0]的值赋给了这,这样p就表示第一行,而*p则读取了第一行的地址,使指针先指向正确的行,然后通过列计算来确定列数

	// *(*(p)+1) a[0][1]的值2



	//注意: *(p+i)+j一定不要写成了(p+i)+j; 比如说我们不要将*(p+2)+3写成(p+2)+3,

	//*(p+2)+3是首先决定了某行后,再确定某列,它与p+11相等,也就是说它指向的是第十二个元素,但是(P+2)+3

    //等于(p+5)

	cout<<"请输入行号:";

	cin>>i;

	cout<<"请输入列号:";

	cin>>j;	

	cout<<"a["<<i<<"]["<<j<<"]:"<<*(*(p+i)+j)<<endl;

    return 0;

}*/



//15.3 指向多维数组的指针作为函数参数

/*#include <iostream>

using namespace std;

int main()

{

	void sum(int *p, int n);

	void find(int(*p)[3], int n);//int(*p)[3] 指向一个有三个元素的数组指针p

	int num[2][3] = {

		{1,2,3},

		{4,5,6}

	};

	sum(*num,6);

	find(num,1);

    return 0;

}

void sum(int *p, int n)

{

    int *end;

	int sum=0;

	end = p + n - 1;

	for(; p<=end; p++){

	    sum = sum+(*p);

	}

	cout<<"所有元素相加的总和为:"<<sum<<endl;

}



void find(int (*p)[3], int n)

{

    int i;

	cout<<"第"<<n+1<<"行的元素为:"<<endl;

	for(i=0; i<3; i++){

	    cout<<*(*(p+n)+i)<<" ";

	}

}*/



//15.4 字符串的指针

/*#include <iostream>

using namespace std;

int main()

{

	char ch1[]="hello word", ch2[20];

	int i=0;

	for(i=0; ch1[i] !='\0'; i++){

	     *(ch2+i) = *(ch1+i);

	}

	*(ch2+i)='\0';

	cout<<"ch1:"<<ch1<<endl;

	cout<<"ch2:"<<ch2<<endl;



    return 0;

}*/



/*#include <iostream>

using namespace std;

int main()

{

	char ch1[]="hello word", ch2[20];

	char *p = ch1, *p2 = ch2;



	for(; *p!='\0'; p++, p2++)

	{

	     *p2 = *p;

	}

	*p2='\0';



	cout<<"ch1:"<<ch1<<endl;

	cout<<"ch2:"<<ch2<<endl;



    return 0;

}*/





// 15.5 接受字符串指针的函数

/*#include <iostream>

using namespace std;

void copy(char a[], char b[])

{

	int i=0;

	for(i=0; a[i] !='\0'; i++){

	    b[i] = a[i];

	}

	b[i]='\0';

}

void main()

{

    char ch1[]="hello word";

	char ch2[20];

	copy(ch1,ch2);

	cout<<"ch1:"<<ch1<<endl;

	cout<<"ch2:"<<ch2<<endl;

}*/





/*#include <iostream>

using namespace std;

void copy(char *p, char *pp)

{

	//for(; *p !='\0'; p++,pp++)

	for(; (*pp++=*p++)!='\0';)

	{

	    //(*pp) = (*p);

	}

	*pp='\0';

};

void main()

{

    char ch1[]="hello word";

	char ch2[20];

	copy(ch1,ch2);

	cout<<"ch1:"<<ch1<<endl;

	cout<<"ch2:"<<ch2<<endl;

}*/



//15.6 指向字符串的指针变量与字符数组的区别

//C语言的字符串有两种表现形式

//char*ch = "Hello world";

//char ch[] = "Hello world";

//两种形式都能实现字符中的存储,但是它们是有区别的,区别主要有以下几点

//1 赋值的不同

//2 初始化的不同

//3 值的不同

//4 定义的不同







// 15.7 指向函数的指针

//指针除了可以指向数组之外,还可以指向函数,由于函数名即函数的入口地址,因此假如将函数名赋给指针变量,那么我们就可以通过这个指针来调用函数

/*#include <iostream>

using namespace std;

void show()

{

    cout<<"hello world"<<endl;

}

int main()

{

	void (*p)(); //定义指向函数的指针变量p,该函数返回值为void,也就是说它没有返回值

	//(*p)后面的括号不能省略,它表示指针p指向的是一个函数

	p = show;

	(*p)();

    return 0;

}*/



//15.8 指向函数的指针的用途

/*#include <iostream>

using namespace std;

int max(int, int);

int min(int, int);

int add(int, int);

//这里的int(*p)(int, int)是一个函数指针

void func(int x, int y, int(*p)(int, int));



int main()

{

	int a, b;

	cout<<"请输入a的值:";

	cin>>a;

	cout<<"请输入b的值:";

	cin>>b;

	cout<<"最大值为:";

	func(a,b,max);

	

	cout<<"最小值为:";

	func(a,b,min);

	cout<<"两值的和为:";

	func(a,b,add);



    return 0;

}



int max(int x, int y)

{

	int z;

	if(x>y){

	   z = x;

	}else{

	   z = y;

	}

	return (z);

}



int min(int x, int y)

{

	int z;

	if(x< y){

	   z = x;

	}else{

	   z = y;

	}

	return z;

}

int add(int x, int y)

{

	int z;

	z = x+y;

	return z;

}



void func(int x, int y, int(*p)(int,int))

{

     int z;

	 z = (*p)(x,y);

	 cout<<"z:"<<z<<endl;

}*/

//不过假如我们不是只用函数名作形参,而是在函数名后面加括号

//void func(int x, int y, int p(int,int))

/*#include <iostream>

using namespace std;

int max(int, int);

int min(int, int);

int add(int, int);

//这里的int(*p)(int, int)是一个函数指针

void func(int x, int y, int p(int, int));



int main()

{

	int a, b;

	cout<<"请输入a的值:";

	cin>>a;

	cout<<"请输入b的值:";

	cin>>b;

	cout<<"最大值为:";

	func(a,b,max);

	

	cout<<"最小值为:";

	func(a,b,min);

	cout<<"两值的和为:";

	func(a,b,add);



    return 0;

}



int max(int x, int y)

{

	int z;

	if(x>y){

	   z = x;

	}else{

	   z = y;

	}

	return (z);

}



int min(int x, int y)

{

	int z;

	if(x< y){

	   z = x;

	}else{

	   z = y;

	}

	return z;

}

int add(int x, int y)

{

	int z;

	z = x+y;

	return z;

}



void func(int x, int y, int p(int,int))

{

     int z;

	 z = (*p)(x,y);

	 cout<<"z:"<<z<<endl;

}*/



//15.9 指针数组

//由多个指针组成的数组即指针数组

//int *p[10]

//这定义了一个拥有10个指针的数组p,它的每个元素都是指针,请注意它与 int (*p)[10]是不同的

//int(*p)[10]中的p是个指向一维数组的指针变量

/*#include <iostream>

using namespace std;

void show(char *name[], int n);

int main()

{

	char *ch[]={"Jack","Mark","Xlc"};

	show(ch, 3);

    return 0;

}

void show(char *name[], int n)

{

    int i;

	for(i=0; i<n; i++)

	{

	    cout<<"name["<<i<<"]:"<<name[i]<<endl;

	}

}

*/





//15.10 指向指针的指针

//一个指针变量可以指向一个整值,也可以指向一个指针

/*#include <iostream>

using namespace std;

int main()

{

	int s=5;

	int *i = &s;

	cout<<"i的值为:"<<*i<<endl;

	cout<<"i的地址为:"<<i<<endl;



	int **ii;

	ii = &i;

	cout<<"ii的地址为:"<<ii<<endl;

	cout<<"ii的值为:"<<*ii<<endl;

	//自己对指针的指针理解还是不够了,没有实现想要的效果

    return 0;

}*/

/*

#include <iostream>

using namespace std;



int main()

{

	char *name[] = {"Jack","Mick","Xlc"};

	char **p;

	int i;

	for(int i=0; i<3; i++)

	{

	    p = name+i;

		cout<<*p<<endl;

	}

    return 0;

}*/



/*#include <iostream>

using namespace std;

int main()

{

	int a[5]={1,2,3,4,5};

	int *p1[5];

	int **p2 = p1;

	for(int i=0; i<5; i++)

	{

	    p2[i] = &a[i];

	}

	for(int i=0; i<5; i++)

	{

	   cout<<**p2;

	   p2++;

	}

    return 0;

}}

*/

  

你可能感兴趣的:(指针)