第二十五章补充内容 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;
}}
*/

  

原文地址:https://www.cnblogs.com/xiangxiaodong/p/2725103.html