• c++ 指针


    一、指针的定义和初始化

    #include<iostream>
    #include<vector>
    #include <algorithm>  
    
    using namespace std;
    
    int main()
    {
    	int a=0;  //变量a 
    	
    	int *p=&a;    //指针p指向变量a的地址 
    	cout<<"p指向的地址为:"<<p<<endl; //p是地址 
    	
    	*p=1;  //*p是p地址上的数据 
    	cout<<"修改了*p为1后,a的值为:"<<a<<endl;
    	
    	int b=*p; //b等于p地址上的数据 
    	cout<<"b的值为:"<<b<<endl;
    	
    	int *q=p;  //q指针,指向了p指针 
    	*q=2; //改变q指针的数据,也就改变了p指针的数据,也就是改变了a; 
    	cout<<"修改了*q为2后,a的值为:"<<a<<endl; 
    	
    }
    

    指针中* 是间接运算符,可以利用指针访问变量。

    二、指针运算

    指针与指针相减表示两个指针间可以存储的变量的个数。

    指针加减某个整数,相当于将指针移动整数个变量大小。

    #include<iostream>
    #include<vector>
    #include <algorithm>  
    
    using namespace std;
    
    int main()
    {
    	double f;
    	double *pf1=&f;
    	double *pf2=pf1+1;
    	cout<<"pf1="<<pf1<<endl;
    	cout<<"pf2=pf1+1,pf2="<<pf2<<endl;
    	cout<<"pf2-pf1="<<pf2-pf1<<endl;
    }
    

    double 占8个字节,0x30-0x28=16-8=8 正好是加整数1,位置移动了8个字节。

     三、指向数组的指针

    1、

    #include<iostream>
    
    using namespace std;
    
    int main() 
    {
    	int ary[10]={0,1,2,3,4,5,6,7,8,9};
    	
    	int *p=&ary[0];
    	cout<<"p指向的地址为:"<<p<<" 该地址上的数据为:"<<*p<<endl;
    	
    	int *q;
    	q=&ary[0];
    	cout<<"q指向的地址为:"<<q<<" 该地址上的数据为:"<<*q<<endl;//这两种方法和指向数据的定义和初始化的方法一样
    	
    	int *m;
    	m=ary;
    	cout<<"m指向的地址为:"<<m<<" 该地址上的数据为:"<<*m<<endl;
    	
    	int *n=ary;
    	cout<<"n指向的地址为:"<<n<<" 该地址上的数据为:"<<*n<<endl; //这两种方法是由于数组名代表的就是数组的首地址,直接让指针等于数组名就可以了。
    }
    

    注意p、&arr[0]、arr都代表了同一个地址,但p是变量指针,可以修改,而后两个不可以修改。

    2、用数组名代表首地址,指针移动输出 

    #include<iostream>
    
    using namespace std;
    
    int main() 
    {
    	int ary[10]={0,1,2,3,4,5,6,7,8,9};
    	for(int i=0;i<10;i++)
    	   cout<<*(ary+i)<<" ";//利用数组名代表首地址,指针移动输出 
    	cout<<endl; 
    }
    

    3、反转数组

    #include<iostream>
    
    using namespace std;
    
    int main()
    {
    	cout<<"利用指针反转数组"<<endl;
    	cout<<endl;
    	int ary[10]={0,1,2,3,4,5,6,7,8,9};
    	
    	cout<<"反转前:"<<endl;
    	for(int i=0;i<10;i++)
    	{
    		cout<<ary[i]<<" ";
    	} 
    	cout<<endl;
    	
    	int *p=ary; //指向数组头的指针
    	int *q=ary+sizeof(ary)/sizeof(ary[0])-1;//很巧妙的获取数组长度的方法; 
    	
    	while(p<q)  //只需比较一半的反转方法 
    	{
    		int t=*p;
    		*p=*q;
    		*q=t;
    		p++;
    		q--;
    	} 
    	cout<<"反转后"<<endl;
    	for(int i=0;i<10;i++)
    	{
    	    cout<<ary[i]<<" ";
        } 
        cout<<endl;
    }
    

     4、地址也可以下标

    #include<iostream>
    
    using namespace std;
    
    int main() 
    {
    	int ary[10]={0,1,2,3,4,5,6,7,8,9};
    	int *p=ary; 
    	for(int i=0;i<10;i++)
    	   cout<<p[i]<<" ";//地址也可以下标表示数 
    	cout<<endl; 
    }
    

     

    四、指向字符串的指针;

    #include<iostream>
    #include<cstdlib>
    #include<string.h>//注意函数的额声明。string不可以。
    using namespace std;
    
    int main()
    {
        cout<<"字符串大小写转换"<<endl;
    	cout<<endl;
    	
    	cout<<"***********************下标法*****************"<<endl;//常规方法 
    	cout<<endl;
    	char str1[]="hello world";
    	cout<<"原来的字符串是:"<<str1<<endl;
    	int len=strlen(str1); 
    	for(int i=0;i<len;i++)
    	{
    		if(str1[i]>='a'&&str1[i]<'z')
    		{
    			str1[i]+='A'-'a';
    		}
    	} 
    	cout<<"大写的字符串:"<<str1<<endl; 
    	cout<<endl;
    	
    	cout<<"***********************数组名法*****************"<<endl;//也是数组名当指针,获取字符 
    	cout<<endl;
    	char str2[]="hello world";
    	cout<<"原来的字符串是:"<<str2<<endl;
    	for(int i=0;*(str2+i);i++)  //char最后以 结尾,其值为0;正好可以作为判断条件,而不用求字符串长度 
    	{
    		if(*(str2+i)>='a' && *(str2+i)<'z')
    		{
    			*(str2+i)+=('A'-'a');
    		}
    	} 
    	cout<<"大写的字符串:"<<str2<<endl; 
    	cout<<endl;
    	
    	cout<<"*******************指针得到元素地址***************"<<endl;//也是数组名当指针,获取字符 
    	cout<<endl;
    	char str3[]="hello world";
    	cout<<"原来的字符串是:"<<str3<<endl;
    	char *p=str3; 
    	for(int i=0;*(p+i);i++)  //char最后以 结尾,其值为0;正好可以作为判断条件,而不用求字符串长度 
    	{
    		if(*(p+i)>='a' && *(p+i)<'z')
    		{
    			*(p+i)+=('A'-'a');
    		}
    	} 
    	cout<<"大写的字符串:"<<str3<<endl; 
    	cout<<endl; 
    	
    	cout<<"*********************移动指针*****************"<<endl;//也是数组名当指针,获取字符 
    	cout<<endl;
    	char str4[]="hello world";
    	cout<<"原来的字符串是:"<<str4<<endl;
    	p=str4; 
    	for(int i=0;*p;i++)  //char最后以 结尾,其值为0;正好可以作为判断条件,而不用求字符串长度 
    	{
    		if(*p>='a' && *p<'z')
    		{
    			*p+=('A'-'a');
    		}
    		p++;
    	} 
    	cout<<"大写的字符串:"<<str4<<endl; 
    	cout<<endl; 
    	
    }
    

    后面几种方法,本质上都是一样的。

    五、指针与动态内存分配

    1、内存分配方式

    #include<iostream>
    #include<string.h>
    
    using namespace std;
    
    int a;  //全局变量,存储在全局/静态存储区 
    
    int main()
    {
        int b;  //局部变量,存储在栈上 
        int *p= new int(); //由运算符 new 分配,存储在堆上 
        static int d;  //静态变量,存储在全局/静态存储区  
        const int e=0;  //常量,存储在常量存储区 
        delete p; //释放堆中的内存 
        return 0;  
    }
    

    2、动态分配内存,很多书上说,如果数组长度依赖输入的话,是个变量,不能用局部变量的方式,但是 DEV C++ 5.11是可以的,如下程序

    #include<iostream>
    #include<string.h>
    
    using namespace std;
    
    int a;  //全局变量,存储在全局/静态存储区 
    
    int main()
    {
       int n;
       while(cin>>n)//输入矩阵长度
       {
    	   int a[n]={0};
    	   for(int i=0;i<n;i++)
    	    {
    	    	cin>>a[i];//赋值
    	    	cout<<a[i]<<" "; 输出
    		}
    	       
        }
    }
    

    #include<iostream>
    #include<string.h>
    
    using namespace std;
    
    int a;  //全局变量,存储在全局/静态存储区 
    
    int main()
    {
       int n;
       while(cin>>n)
       {
    	   int a[n];
    	   for(int i=0;i<n;i++)
    	    {
    	    	cin>>a[i];
    		}
    		int sum=0;
    		for(int i=0;i<n;i++)
    		{
    			sum+=a[i];
    		}
    		cout<<(double)sum/n<<endl;      
        }
    }
    

    3、

    #include<iostream>
    #include<string.h>
    
    using namespace std;
    
    int a;  //全局变量,存储在全局/静态存储区 
    
    int main()
    {
       int *pcount = new int; //堆上的一个数 
       cout<<"数组长度:";
       cin>>*pcount;
       cout<<*pcount<<endl;
       
       cout<<"输入数组元素"<<endl;
       int *parray = new int[*pcount];   
       for(int i=0;i<*pcount;i++) //为什么用下标表示啊? 
       {
           cin>>parray[i];	
       } 
       cout<<"数组为:"<<endl; 
       for(int i=0;i<*pcount;i++)
       {
       	    cout<<parray[i]<<" ";
       }
       delete pcount;
       delete parray;
       return 0;   
    }
    

    连接了指针和下标,蜜汁动态啊。

    六、输出杨辉三角

    1、两个数组的方式输出杨辉三角

    #include<iostream>
    #include<string.h>
    
    using namespace std;
    
    int a;  //全局变量,存储在全局/静态存储区 
    
    int main()
    {
    	
        cout<<"输入行数:";
        int n;
        cin>>n;
        int a[20]={0},b[20]={0};//数组初始赋值 
        for(int i=0;i<n;i++)
        {
       	    b[0]=1;
       	    b[i]=1;//每行第一个和最后一个都为1 
    		for(int j=1;j<i;j++)
    		{
    			b[j]=a[j]+a[j-1]; //计算剩余位置值 
    		}
    		
    		for(int j=0;j<n-i-1;j++) //前导空格 
    		{
    		    cout<<" ";
    		}
    		for(int j=0;j<=i;j++)
    		{
    			if(j>0)
    			    cout<<" ";
    			cout<<b[j]; //输出值 
    		}
    		cout<<endl;
    		
    		for(int j=0;j<=i;j++)//b数组值赋给a数组 
    		{
    			a[j]=b[j];
    		 } 
        } 
        return 0;
    }

    2、

  • 相关阅读:
    DockerPush
    DockerInstall
    DockerFile
    基于虚拟机实例/java程序线程的虚拟机内存分配
    Class文件结构及方法中的指令
    JAVA类型生命周期的开始阶段和使用阶段/以及创建对象的几种方式
    。。。。。毕业季
    PCA算法
    ffmpeg将图片转为视频
    Linux下使用bgslibrary的OpenCv库
  • 原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/9010636.html
Copyright © 2020-2023  润新知