指针的常见用法

指针的常见用法

最近在指针的使用上出了很多问题,所以就决定把指针的常见用法做一个总结,供大家参考。每个程序都有实验结果的截图,可是上传之后不知道截图去哪里了,我的邮箱是liuzuyi2007@126.com,想要看截图的,给我发邮件我给你发!

(1)定义指针变量并给与指针的指向,

定义了int  double  char l类型的三个变量,并建立相应的指针,给予指针指向,输出结果

代码

#include<iostream>

using namespace std;

int main()

{

  int a=10;

  int *a1=&a;

  double b=20,*b1;

    b1=&b;

  char c='m',*c1;

    c1=&c;

  cout<<"a="<<a<<" "<<"*a1="<<*a1<<" "<<"a1="<<a1<<endl;

  cout<<"b="<<b<<" "<<"*b1="<<*b1<<" "<<"b1="<<b1<<endl;

  cout<<"c="<<c<<" "<<"*c1="<<*c1<<" "<<"c1="<<c1<<endl; //产生疑问的地方在这里?

 return 0;

}




在上面的例子中定义了int  double  char l类型的三个变量,并建立相应的指针,给予指针指向,在输出结果是为什么 *c1 c1 得到相同的结果,而int  double 类型的 *a1 a1*b1b1,分别输出对应的值和地址?

原因:cout操作字符指针的话,它遇到地址,就会直接去寻找这个地址所指向的内容,并把它的空间里的机器数按照字符的规则转化成字符输出,直到遇到\0这个操作符才停止。

(2)通过指针引用数组

在用指针引用数组的时候要记得这一点:数组名就是数组的首地址

举例说明:

定义一个数组  int a[10]={10,9,8,7,6,5,7,3,2,1};此时的数组名a 等价于&a[0]

通过这个例子可以证明这句话是对的!

#include<iostream>

using namespace std;

int main()

{

  int a[10]={10,9,8,7,6,5,7,3,2,1};

  int *a1;

   a1=a;

  double b[10]={11,12,13,14,15,16,17,18,19,20};

  double *b1;

       b1=b;

  char c[10]="qwertyui",*c1;

      c1=c;

  cout<<"a="<<a<<" "<<"*a1="<<*a1<<" "<<"a1="<<a1<<endl;

  cout<<"b="<<b<<" "<<"*b1="<<*b1<<" "<<"b1="<<b1<<endl;

  cout<<"c="<<c<<" "<<"*c1="<<*c1<<" "<<"c1="<<c1<<endl;

 return 0;

}



在这里会再次产生疑问?明明是输出数组的首地址,为什么输出字符数组时输出了里面所有的内容?

原因:因为同一个字符数组的储存在内存中是从低到到高储存的,是以‘\0’未结束标志的!在输出字符数组的首地址内容后,因为没有找到结束标志,无法让输出结束,所以就继续输出,至到出现字符串数组的结束标志!

通过仔细观察这个例子也可以得出一个猜想:

要想输出字符数组里的每一个坐标下对应的内容,只需要通过控制字符数组的移动,输出*c1,j即可!在下面的例子里证明这个猜想是正确的,对于其他的数组也是这样

(3)通过指针的移动输出数组里的内容

要想输出数组里的每一个坐标下对应的内容,只需要通过控制数组的移动,输出(*指针名)即可!

#include<iostream>

using namespace std;

int main()

{

  int a[10]={10,9,8,7,6,5,7,3,2,1};

  int *a1;

   a1=a;

  double b[10]={11,12,13,14,15,16,17,18,19,20};

  double *b1;

       b1=b;

  char c[10]="qwertyui",*c1;

      c1=c;

      int i;

 for(a1=a;a1<(a+10);a1++)

 cout<<*a1<<" ";

 cout<<endl;

 for(b1=b;b1<(b+10);b1++)

 cout<<*b1<<" ";

 cout<<endl;

 for(c1=c;*c1!='\0';c1++)

 cout<<*c1<<" ";

 return 0;

}


通过上面三个例题,知道了指针的简单应用,下面就来了解指针与多维数组在一起是的用法吧!

(4)指针和多维数组

因为在数组在是一段连续的内存空间,为了输出其内容,只需要每次移动一个位置即可!

!)这是第一种方式,通过建立指针输出

#include<iostream>

using namespace std;

int main()

{

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

 int *p;

 char c[3][4]={"qwr","tyu","opa"};

 char *c1;

 c1=&c[0][0];

 p=a[0];//指向二维数组的首地址

 int i,j;

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

 {

 cout<<*(p+i)<<" ";//(a+i)来控制行的移动,再加j来控制列的移动

 }

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

 {

 cout<<*(c1+i)<<" ";

 }

 return 0;

}

ii)建立指向二维数组的数组指针

下面的程序建立数组指针,输出了数组指针指向的内容

#include<iostream>

using namespace std;

int main()

{

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

 int (*p)[2];

 p=a;

 int i,j;

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

  {

   cout<<*p[i]<<" ";

  }

 

 return 0;

}



通过结果可以看出,程序建立了二维数组并初始化,并建立了对应的数组指针,该数组指针的移动是跨行的,即每次所移动的是一行8个字节,再说的简明一点就是从a[0][o]移向a[1][0].

为了正确的输出该数组的所有内容,需要控制其在行内移动!

#include<iostream>

using namespace std;

int main()

{

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

 int (*p)[2];

 p=a;

 int i,j;

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

  {

   for(j=0;j<2;j++)

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

  }

 

 return 0;

}

通过上面的这个例子,完美的实现了对二维数组里每一行每一列的内容的输出,此方法可以可以扩展到多维数组,输出方法都是这样的!在这里就不在多说了,动手实践才能出真知啊!

(5)指针与函数

最先接触的指针与函数的使用就是进行两个值得交换了!下面就把这个程序展示出来和大家分享!

#include<iostream>

using namespace std;

void swap(int *a1,int *a2)

{

 int temp;

 temp=*a1;

 *a1=*a2;

 *a2=temp;

}

int main()

{

  int a=10,b=20;

  int *a1=&a,*b1=&b;

  swap(a1,b1);

  cout<<"a="<<a<<" b="<<b;

 return 0;

}



上面这个程序利用指针实现了简单的两个值的交换,还有很多利用指针的实现方式,在这里就不在多说了,下面这个程序是利用指针变量访问它指向的函数!

(6)利用指针变量访问它指向的函数!

定义指向函数的指针变量的语法是 类型名 (指针变量名)(参数列表)

这是一个利用指针变量访问它指向的函数的简单例子,需要注意的一点就是指向函数的指针变量,要和它指向的函数完全一致!包括类型名、参数列表

#include<iostream>

using namespace std;

int max(int a1,int a2)

 return a1>a2?a1:a2;

}

int main()

{

  int a=10,b=20;

  int (*p)(int z,int x);

  int max(int a1,int a2);

  p=max;

  cout<<"max="<<p(a,b);

 

 return 0;

}



感悟:

用了半晌时间把这个使用指针变量的基本方法总结出来了,以前总觉得指针用着挺简单的,但是在用的时候频频出错,所以就索性把指针最基本,最简单的方法总结一下,对知识算是一个复习!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值