指针的常见用法
2013-06-03 08:25
183 查看
指针的常见用法
最近在指针的使用上出了很多问题,所以就决定把指针的常见用法做一个总结,供大家参考。每个程序都有实验结果的截图,可是上传之后不知道截图去哪里了,我的邮箱是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,*b1、b1,分别输出对应的值和地址?
原因: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;
}
感悟:
用了半晌时间把这个使用指针变量的基本方法总结出来了,以前总觉得指针用着挺简单的,但是在用的时候频频出错,所以就索性把指针最基本,最简单的方法总结一下,对知识算是一个复习!
相关文章推荐
- 指针常见用法总结
- C语言双指针的常见用法
- 双指针常见用法1
- 嵌入式中指针几个简单却常见的用法
- 双指针常见用法2
- 指针的常见用法和错误总结
- 常见的指针数据类型以及const用法详解
- 双指针的常见用法
- 指针用法及常见形式
- C++ 指针常见用法小结
- c语言常见的几种指针用法
- 【原创】C指针常见用法
- 【原创】C指针常见用法
- Java 枚举(enum) 详解7种常见的用法
- PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
- C++类的成员函数的指针和mem_fun适配器的用法
- Oracle技术之Unix下awk的常见用法示例
- sqlmap注入常见用法一条龙 【转】
- typedef 函数指针的用法
- iomanip常见用法