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、

原文地址:https://www.cnblogs.com/ruo-li-suo-yi/p/9010636.html