zoukankan      html  css  js  c++  java
  • 第二十五章补充内容 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;
    }}
    */
    

      

  • 相关阅读:
    Linux篇---ftp服务器的搭建
    【Spark篇】---SparkStreaming+Kafka的两种模式receiver模式和Direct模式
    【Spark篇】---Spark故障解决(troubleshooting)
    【Spark篇】---Spark解决数据倾斜问题
    【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优
    【Redis篇】Redis持久化方式AOF和RDB
    【Redis篇】Redis集群安装与初始
    【Redis篇】初始Redis与Redis安装
    Git提示“warning: LF will be replaced by CRLF”
    Git 忽略特殊文件
  • 原文地址:https://www.cnblogs.com/xiangxiaodong/p/2725103.html
Copyright © 2011-2022 走看看