- 浏览: 255613 次
- 性别:
- 来自: 宁波
文章分类
最新评论
-
ydqwtt:
但是我的Java Source File中显示的是*.clas ...
MyEclipse6.5 注释乱码 -
BlueDream348:
谢谢。。收益了
SOAP -
2838938:
学习一下
Oracle监听器安装与配置 -
luorongda:
满足范式要求的数据库设计是结构清晰的,同时可避免数据冗余和操作 ...
数据库设计 -
meteormatt:
这篇文章写的不错.但是排版不怎么好.
Panel和PlaceHolder的区别
一. 回顾指针概念:
早在本系列第二篇中我就对指针的实质进行了阐述。今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧!
当我们程序如下申明变量:
short int i;
char a;
short int * pi;
程序会在内存某地址空间上为各变量开辟空间,如下图所示。
内存地址→6 7 8 9 10 11 12 13 14 15
-------------------------------------------------------------------------------------
… | | | | | | | | | |
-------------------------------------------------------------------------------------
|short int i |char a| |short int * pi|
图中所示中可看出:
i 变量在内存地址5的位置,占两个字节。
a变量在内存地址7的位置,占一个字节。
pi变量在内存地址9的位置,占两个字节。(注:pi 是指针,我这里指针的宽度只有两个字节,32位系统是四个字节)
接下来如下赋值:
i=50;
pi=&i;
经过上在两句的赋值,变量的内存映象如下:
内存地址→6 7 8 9 10 11 12 13 14 15
--------------------------------------------------------------------------------------
… | 50 | | | 6 | | | |
--------------------------------------------------------------------------------------
|short int i |char a| |short int * pi|
看到没有:短整型指针变量pi的值为6,它就是I变量的内存起始地址。所以,这时当我们对*pi进行读写操作时,其实就是对i变量的读写操作。如:
*pi=5; //就是等价于I=5;
你可以回看本系列的第二篇,那里有更加详细的解说。
二. 指针的地址与指向另一指针地址的指针
在上一节中,我们看到,指针变量本身与其它变量一样也是在某个内存地址中的,如pi的内存起始地址是10。同样的,我们也可能让某个指针指向这个地址。
看下面代码:
short int * * ppi; //这是一个指向指针的指针,注意有两个*号
ppi=π
第一句:short int * * ppi;——申明了一个指针变量ppi,这个ppi是用来存储(或称指向)一个short int * 类型指针变量的地址。
第二句:&pi那就是取pi的地址,ppi=π就是把pi的地址赋给了ppi。即将地址值10赋值给ppi。如下图:
内存地址→6 7 8 9 10 11 12 13 14 15
------------------------------------------------------------------------------------
… | 50 | | | 6 | 10 | |
------------------------------------------------------------------------------------
|short int i|char a| |short int * pi|short int ** ppi|
从图中看出,指针变量ppi的内容就是指针变量pi的起始地址。于是……
ppi的值是多少呢?——10。
*ppi的值是多少呢?——6,即pi的值。
**ppi的值是多少呢?——50,即I的值,也是*pi的值。
呵呵!不用我说太多了,我相信你应明白这种指针了吧!
三. 一个应用实例
1. 设计一个函数:void find1(char array[], char search, char * pi)
要求:
这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search里的字符。如果找到,函数通过第三个参数(pa)返回值为array字符串中第一个找到的字符的地址。如果没找到,则为pa为0。
设计:
依题意,实现代码如下。
void find1(char [] array, char search, char * pa)
{
int i;
for (i=0;*(array+i)!=0;i++)
{
if (*(array+i)==search)
{
pa=array+i
break;
}
else if (*(array+i)==0)
{
pa=0;
break;
}
}
}
你觉得这个函数能实现所要求的功能吗?
调试:
我下面调用这个函数试试。
void main()
{
char str[]={“afsdfsdfdf\0”}; //待查找的字符串
char a=’d’; //设置要查找的字符
char * p=0; //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。
find1(str,a,p); //调用函数以实现所要操作。
if (0==p )
{
printf (“没找到!\n”);//1.如果没找到则输出此句
}
else
{
printf(“找到了,p=%d”,p); //如果找到则输出此句
}
}
分析:
上面代码,你认为会是输出什么呢?
运行试试。
唉!怎么输出的是:没有找到!
而不是:找到了,……。
明明a值为’d’,而str字符串的第四个字符是’d’,应该找得到呀!
再看函数定义处:void find1(char [] array, char search, char * pa)
看调用处:find1(str,a,p);
依我在第五篇的分析方法,函数调用时会对每一个参数进行一个隐含的赋值操作。
整个调用如下:
array=str;
search=a;
pa=p; //请注意:以上三句是调用时隐含的动作。
int i;
for (i=0;*(array+i)!=0;i++)
{
if (*(array+i)==search)
{
pa=array+i
break;
}
else if (*(array+i)==0)
{
pa=0;
break;
}
}
哦!参数pa与参数search的传递并没有什么不同,都是值传递嘛(小语:地址传递其实就是地址值传递嘛)!所以对形参变量pa值(当然值是一个地址值)的修改并不会改变实参变量p值,因此p的值并没有改变(即p的指向并没有被改变)。
(如果还有疑问,再看一看《第五篇:函数参数的传递》了。)
修正:
void find2(char [] array, char search, char ** ppa)
{
int i;
for (i=0;*(array+i)!=0;i++)
{
if (*(array+i)==search)
{
*ppa=array+i
break;
}
else if (*(array+i)==0)
{
*ppa=0;
break;
}
}
}
主函数的调用处改如下:
find2(str,a,&p); //调用函数以实现所要操作。
再分析:
这样调用函数时的整个操作变成如下:
array=str;
search=a;
ppa=&p; //请注意:以上三句是调用时隐含的动作。
int i;
for (i=0;*(array+i)!=0;i++)
{
if (*(array+i)==search)
{
*ppa=array+i
break;
}
else if (*(array+i)==0)
{
*ppa=0;
break;
}
}
看明白了吗?
ppa指向指针p的地址。
对*ppa的修改就是对p值的修改。
发表评论
-
error C2440 “static_cast” 无法从“void (__thiscall CPppView )(void)”转换为“LRESULT (__t
2010-09-05 20:27 7152不能转换void (_thiscall CMainFrame: ... -
堆和栈的理论知识
2010-08-19 13:29 8563.1申请方式 stack: 由系统自动分配。 例如, ... -
变量定义与声明的区别
2010-08-19 13:21 1396我们在程序设计中,时 ... -
ON_COMMAND ON_MESSAGE ON_NOTIFY区别与联系
2010-05-07 16:36 1663ON_COMMAND是菜单和工具栏 ... -
C++中头文件(.h)和源文件(.cpp)都应该写些什么zz
2010-04-30 16:53 4760头文件(.h): 写类的声明(包括类里面的成 ... -
【转】stdafx.h、stdafx.cpp的作用
2010-04-19 10:39 2407http://hi.baidu.com/ouyang ... -
如何输出_tmain中的argv[]
2010-04-19 10:17 2216作者:Tuuzed(土仔) 版权声明:可以任意 ... -
虚函数2
2009-05-05 15:15 893虚函数为了重载和多 ... -
c++中虚函数和多态性1
2009-05-05 15:11 954虚函数联系到多态,多 ... -
派生类的3中继承方式
2009-05-05 14:39 12211. 公有继承(public) 公有继承的特点 ... -
虚函数覆盖
2009-05-04 21:34 26511。覆盖函数,即在子类中用相同的函数名和签名重写父类的方法, ... -
拷贝构造函数与赋值函数
2009-05-04 14:32 0关于拷贝构造函数和赋值函数,是被很多程序员忽视的问题,具体到我 ... -
内联函数和宏
2009-05-04 10:55 1012第一部分:宏 为什么要使用宏呢? 因为函数的调用必须要将程 ... -
实例成员变量和静态成员变量
2009-05-04 10:32 2210所有的对象都 ... -
修练8年C++面向对象程序设计之体会(完结篇)
2009-05-03 10:23 8982.5 其它建议 (1)不要编写一条过分复杂的语句, ... -
修练8年C++面向对象程序设计之体会
2009-05-03 10:20 7152.3 new、delete 与指针 ... -
修练8年C++面向对象程序设计之体会
2009-05-03 10:18 9632 良好的编程风格 内功深厚的武林高手出招往往平淡无 ... -
修练8年C++面向对象程序设计之体会
2009-05-03 10:15 9831.3 虚函数与多态 ... -
修练8年C++面向对象程序设计之体会2
2009-05-03 10:13 9271.2 继承与组合 如果A 是基类,B 是A 的派生类, ... -
new/delete 与malloc/free 的区别
2009-05-02 21:16 2022由于编程的习惯,动态管理内存的时候总是用new/delete, ...
相关推荐
指针 指针教程 指针练习指针 指针教程 指针练习
c++句柄,智能指针 指针间的区别,初学者可以下来了解了解
指针 指针变量运算 指针数组相关知识点
指针指针数组多级指针动态指针PPT学习教案.pptx
C_C++指针指针应用详解
指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针...
详细的讲述了C语言指针指针的用法 彻底搞定C语言指针————————————
我知道函数指针是指向函数的指针,指针函数还是指一个函数的返回值是一个指针,但下面 的几道题还是感觉很迷惑。各位能否讲的详细点呢? (1)float(**def)[10] def是什么? (2)double*(*gh)[10] gh是什么? (3)double...
彻底理解指针,指针数组和数组指针,指针函数和函数指针.doc
C++ 指针的学习,学习C或C++必学重点,希望大家能在本文中学得更多的知识
这里面对指针做了详细的分析,搞定这个分析,你绝对搞定指针,掌握c语言!
关于指针函数、函数指针等诸多易混淆一错用的辨析
指针与二维数组 数组指针 指针数组 多级指针
智能指针其实是一个类,是对普通指针进行了封装,将其作为参数传入智能指针的构造函数实现绑定。只不过通过运算符重载让它“假装”是一个指针,也可以进行解引用等操作。既然智能指针是一个类,对象都存在于栈上,...
详细的介绍指针的方方面面,更好的理解和运用指针
看了这个会认识到指针是什么,为了以后的学习,这个很重要,好好学吧
要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。让我们分别说明。 先声明几个指针放着做例子: 例一: (1)int *ptr; ...
鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载鼠标指针下载Yangcong WolfYangcong WolfYangcong WolfYangcong WolfYangcong WolfYangcong ...
指针材料指针材料指针材指针指针指针材料材料指针材料材料料指针材料指针材料