网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > C/C++
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.Access数据库规格C++.
.C语言编程常见问题解答之ANSI/I.
.图片反色的一段程序.
.利用C++编写一个猜字游戏.
.一个分形图形.
.autoconf 和automake生成Makefil.
.C++习题与解析(引用-02).
.使用C++和XML建立智能文档(三).
.C程序开发初级讲座之循环结构.
.用C++实现简单的文件I/O操作.
.猜数游戏.
.PE文件格式详解(1).
.对C++程序内存管理的精雕细琢.
.C++中用于计算四则混合运算表达式.
.C语言的程序结构.
.如何在C/C++中调用Java.
.Win9x下隐藏程序不出现在CTRL-AL.
.怎样编制黑白棋(4).
.守护进程的创建.
.经典与现代的结合:在MFC中集成RA.

指针运算符与指针表达式

发表日期:2008-3-8



  6.3.1指针运算符与指针表达式
在C中有两个关于指针的运算符:
•&运算符:取地址运算符,&m即是变量m的地址。
•*运算符:指针运算符,*ptr表示其所指向的变量。
[例6-2]从键盘输入两个整数,按由大到小的顺序输出。
main()
{
int*p1,*p2,a,b,t;/*定义指针变量与整型变量*/
scanf("%d,%d",&a,&b);
p1=&a;/*使指针变量指向整型变量*/
p2=&b;
if(*p1<*p2)
{/*交换指针变量指向的整型变量*/
t=*p1;
*p1=*p2;
*p2=t;
}
printf("%d,%d\n",a,b);
}
在程序中,当执行赋值操作p1=&a和p2=&b后,指针实实在在地指向了变量a与b,这时
引用指针*p1与*p2,就代表了变量a与b。
运行程序:
RUN
3,4
4,3
在程序运行过程中,指针与所指的变量之间的关系如图6-4所示:
指针运算符与指针表达式(图一)
当指针被赋值后,其在内存的安放如a),当数据比较后进行交换,这时,指针变量与所指向的变量的关系如b)所示,在程序的运行过程中,指针变量与所指向的变量其指向始终没变。
下面对程序做修改。
[例6-3]
main()
{
int*p1,*p2,a,b,*t;
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
if(*p1<*p2)
{/*指针交换指向*/
t=p1;
p1=p2;
p2=t;
}
printf("%d,%d\n",*p1,*p2);
}
程序的运行结果完全相同,但程序在运行过程中,实际存放在内存中的数据没有移动,而是将指向该变量的指针交换了指向。其示意如图6-5:
指针运算符与指针表达式(图二)
当指针交换指向后,p1和p2由原来指向的变量a和b改变为指向变量b和a,这样一来,*p1就表示变量b,而*p2就表示变量a。在上述程序中,无论在何时,只要指针与所指向的变量满足p=&a;我们就可以对变量a以指针的形式来表示。此时p等效于&a,*p等效于变量a。
6.3.2指针变量作函数的参数
函数的参数可以是我们在前面学过的简单数据类型,也可以是指针类型。使用指针类型做函数的参数,实际向函数传递的是变量的地址。由于子程序中获得了所传递变量的地址,在该地址空间的数据当子程序调用结束后被物理地保留下来。
[例6-4]利用指针变量作为函数的参数,用子程序的方法再次实现上述功能。
main()
{
void chang();/*函数声明*/
int*p1,*p2,a,b,*t;
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
chang(p1,p2);/*子程序调用*/
printf("%d,%d\n",*p1,*p2);
return0;
}
void chang(int*pt1,int*pt2)
{/*子程序实现将两数值调整为由大到小*/
intt;
if(*pt1<*pt2)/*交换内存变量的值*/
{
t=*pt1;*pt1=*pt2;*pt2=t;}
return;
}
由于在调用子程序时,实际参数是指针变量,形式参数也是指针变量,实参与形参相结合,传值调用将指针变量传递给形式参数pt1和pt2。但此时传值传递的是变量地址,使得在子程序中pt1和pt2具有了p1和p2的值,指向了与调用程序相同的内存变量,并对其在内存存放的数据进行了交换,其效果与[例6-2]相同。
思考下面的程序,是否也能达到相同的效果呢?
main()
{
void chang();
int*p1,*p2,a,b,*t;
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
chang(p1,p2);
printf("%d,%d\n",*p1,*p2);
}
void chang(int*pt1,int*pt2)
{
int*t;
if(*pt1<*pt2)
{
t=pt1;pt1=pt2;pt2=t;
}
return;
}
程序运行结束,并未达到预期的结果,输出与输入完全相同。其原因是对子程序来说,函数内部进行指针相互交换指向,而在内存存放的数据并未移动,子程序调用结束后,main()函数中p1和p2保持原指向,结果与输入相同。
上一篇:多维数组 人气:569
下一篇:指针变量的定义与引用 人气:584
浏览全部C/C++的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐