77范文网 - 专业文章范例文档资料分享平台

彻底搞定C语言指针详解完整版(4)

来源:网络收集 时间:2019-04-09 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

请注意在调用执行Exchg1函数的操作中我人为地加上 了头两句:

int x=a;

int y=b;

这是调用函数时的两个隐含动作。它确实存在, 现在我只不过把它显式地写了出来而已。问题一下就清晰起来啦。(看到这里,现在你认为函数里面交 换操作的是a,b变量或者只是x,y变量呢?)

原来 ,其实函数在调用时是隐含地把实参a,b 的 值分别赋值给了x,y,之后在你写的Exchg1函数体内再也没有对a,b进行任何的操作了。交换的只是x, y变量。并不是a,b.当然a,b的值没有改变啦!函数只是把a,b的值通过赋值传递给了x,y,函数里头 操作的只是x,y的值并不是a,b的值。这就是所谓的参数的值传递了。

哈哈,终于明白了,正是 因为它隐含了那两个的赋值操作,才让我们产生了前述的迷惑(以为a,b已经代替了x,y,对x,y的操 作就是对a,b的操作了,这是一个错误的观点啊!)。 指向另一指针的指针

一、针概念:

早在本系列第二篇中我就对指针的实质进行了阐述 。今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧!

当我 们程序如下申明变量:

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)

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库彻底搞定C语言指针详解完整版(4)在线全文阅读。

彻底搞定C语言指针详解完整版(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/583400.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: