﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-C++冲浪板面-随笔分类-交错线</title><link>http://www.cppblog.com/shu-64/category/792.html</link><description>记录C++点滴感悟</description><language>zh-cn</language><lastBuildDate>Fri, 23 May 2008 00:18:40 GMT</lastBuildDate><pubDate>Fri, 23 May 2008 00:18:40 GMT</pubDate><ttl>60</ttl><item><title>指针这沟通的天才</title><link>http://www.cppblog.com/shu-64/archive/2006/05/17/7318.html</link><dc:creator>SHUIGANG</dc:creator><author>SHUIGANG</author><pubDate>Wed, 17 May 2006 11:15:00 GMT</pubDate><guid>http://www.cppblog.com/shu-64/archive/2006/05/17/7318.html</guid><wfw:comment>http://www.cppblog.com/shu-64/comments/7318.html</wfw:comment><comments>http://www.cppblog.com/shu-64/archive/2006/05/17/7318.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/shu-64/comments/commentRss/7318.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shu-64/services/trackbacks/7318.html</trackback:ping><description><![CDATA[    函数调用所采用的虚实结合在传值方面是有缺陷的.单向的"值传递"方式,只能从实参向形参传递数据,形参值的改变无法回传给实参!恩,这在某种情况下让人着实无法忍受.
    今儿终于捡到个大宝贝把问题搞定了,高兴哈!指针,你这沟通方面的天才!给正郁闷着的叨咕下先.
    [指针作为函数参数时,当然也不会改变实参指针变量的值,但可以改变实参指针变量所指向变量的值.]这就是解决问题的关键.
    进一步解释哈,函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针变量作函数参数,就可以通过指针变量改变主调函数中变量的值,相当于通过函数调用从被调用的函数中得到多个值.如果不用指针变量,我们就很难做到这一点.
    举正反两个简单的例子来介绍具体实现方法.先让大家看个危机四伏却很正确的:
    #include <iostream>
    using namespace std;
    int main( )
    { void swap(int *p1,int *p2);                      //函数声明
     int *pointer_1,*pointer_2,a,b;                 //定义指针变量pointer_1,pointer_2,整型变量a,b
       cin>>a>>b;                             
       pointer_1=&a;                                       //使pointer_1指向a
       pointer_2=&b;                                       //使pointer_2指向b
       if(a<b) swap(pointer_1,pointer_2);          //如果a<b,使*pointer_1和*pointer_2互换
     cout<<"max="<<a<<"min="<<b<<endl;//a已是大数,b是小数
     return 0;
     }

     void swap(int *p1,int *p2)                          //函数的作用是将*p1的值与*p2的值交换
   { int temp;
       temp = *p1;
         *p1 = *p2;
         *p2 = temp;
    <注>不要将main函数中的swap函数调用写成　if(a<b) swap(*pointer_1,*pointer_2);
           请分析错在哪里?pointer_1和pointer_2是指针变量,其值为地址. *pointer_1和*pointer_2是整型变量,其值为整数,与形参不匹配.
           
           另外,请注意交换*p1和*p2的值是如何实现的.如果写成以下这样,同样是有问题的:
           void swap(int *p1,int *p2)
           {int *temp;
             *temp= *p1;
                 *p1= *p2;
                 *p2= *temp;
            }
            *p1就是a,是整型变量.而*temp是指针变量temp所指向的变量.由于未对temp赋值,因此temp并无确定的值(它的值是不可预见的),也就是说,temp所指向的单元是不可预见的.在这样的情况下,对*temp赋值是危险的,可能会破坏系统的正常工作状况.

    下面这个是反面的:
    #include <iostream>
    using namespace std;
    int main( )
    { void swap(int *p1,int *p2);                      //函数声明
     int *pointer_1,*pointer_2,a,b;                 //定义指针变量pointer_1,pointer_2,整型变量a,b
       cin>>a>>b;                             
       pointer_1=&a;                                       //使pointer_1指向a
       pointer_2=&b;                                       //使pointer_2指向b
       if(a<b) swap(pointer_1,pointer_2);          //如果a<b,使*pointer_1和*pointer_2互换
     cout<<"max="<<a<<"min="<<b<<endl;//a已是大数,b是小数
     return 0;
     }

     void swap(int *p1,int *p2)
     { int *temp;
        temp=p1;
            p1=p2;
            p2=temp;
     }
    程序编写者的意图是:交换pointer_1和pointer_2的值,使pointer_1指向大的变量.但是这是办不到的,问题在于,实参变量和形参变量之间的数据传递是单向的.
    由此,可看出只有正确的运用指针这个沟通方面的天才,才能实现多值的参数传递捏.好好体味哈,天才都是难以驾御的,呵呵.
       <img src ="http://www.cppblog.com/shu-64/aggbug/7318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shu-64/" target="_blank">SHUIGANG</a> 2006-05-17 19:15 <a href="http://www.cppblog.com/shu-64/archive/2006/05/17/7318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>译码程序</title><link>http://www.cppblog.com/shu-64/archive/2006/02/06/3096.html</link><dc:creator>SHUIGANG</dc:creator><author>SHUIGANG</author><pubDate>Mon, 06 Feb 2006 14:48:00 GMT</pubDate><guid>http://www.cppblog.com/shu-64/archive/2006/02/06/3096.html</guid><wfw:comment>http://www.cppblog.com/shu-64/comments/3096.html</wfw:comment><comments>http://www.cppblog.com/shu-64/archive/2006/02/06/3096.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/shu-64/comments/commentRss/3096.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shu-64/services/trackbacks/3096.html</trackback:ping><description><![CDATA[为使电文保密,往往按一定规律将电文转化成密码,收报人再按约定的规律将其译回原文.例如,可以按以下规律将电文变成密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D.字母按上述规律转换,非字母字符不变.如"Wonderful!"转换为"Asrhivjyp!"．输入一行字符,要求输出其相应的密码.

先分析解题思路:转换的规律是将原来的字符c加4,就得到密码字符的ASCII代码.可用c=c+4来处理.但是还要对w,x,y,z(包括大小写)这4个字母作专门处理,使它们变为大小写的a,b,c,d.方法是如果执行完c=c+4后,c的新值已大于z(或Z),则表示原来的字母在v(或V)之后,应将它转换为a~d(或A~D).办法是使c减26.

程序如下:
#include <iostream>
using namespace std;
int main( )
{char c;
 while ((c=getchar( ))!='\n')
   {if ((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
       {c=c+4;
         if(c>'Z'&&c<='Z'+4||c>'z')c=c-26;
       }
     cout<<c;
   }
cout<<endl;
return 0;
}
        
运行结果如下:
I am going tu Beijing!
M eq ksmrk xs Fimnmrk!

while语句中括号内的表达式有3个作用:1.从键盘读入一个字符,这是用getchar函数实现的;2.将读入的字符赋给字符变量c;3.判别这个字符是否为'\n'(即换行符).如果是换行符就执行while语句中的复合语句(即花括号内的语句),对输入的非换行符的字符进行转换处理.

按前面分析的思路对输入的字符进行处理.有一点请注意:内嵌的if语句不能写成if (c>'Z'||c>'z') c=c-26;因为所有小写字母都满足"c>'Z'"条件,从而也执行"c=c-26;"语句,着就会出错.因此必须限制其范围为"c>'Z'&&c<='Z'+4",即原字母为'W'到'Z',在此范围以外的不是原大写字母W~Z,不应按此规律转换.请考虑:为什么对小写字母不按此处理,即写成c>'z'&&c<='z'+4而只须写成"c>'z'"即可.
<img src ="http://www.cppblog.com/shu-64/aggbug/3096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shu-64/" target="_blank">SHUIGANG</a> 2006-02-06 22:48 <a href="http://www.cppblog.com/shu-64/archive/2006/02/06/3096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++标准</title><link>http://www.cppblog.com/shu-64/archive/2006/01/19/2898.html</link><dc:creator>SHUIGANG</dc:creator><author>SHUIGANG</author><pubDate>Thu, 19 Jan 2006 04:56:00 GMT</pubDate><guid>http://www.cppblog.com/shu-64/archive/2006/01/19/2898.html</guid><wfw:comment>http://www.cppblog.com/shu-64/comments/2898.html</wfw:comment><comments>http://www.cppblog.com/shu-64/archive/2006/01/19/2898.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shu-64/comments/commentRss/2898.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shu-64/services/trackbacks/2898.html</trackback:ping><description><![CDATA[　　C++是从C语言发展而来的，为了与C兼容，C++保留了C的许多用法，人们在编写C++程序时也常常沿用C的某些传统用法。例如，主函数为viod类型，无返回值；头文件带后缀.h;使用系统库时不使用命名空间等。但是，ＡＮＳＩ　Ｃ＋＋标准有新的规定，要求主函数为int类型，如果程序正常执行则返回０值；系统头文件不带后缀.h;使用系统库时使用命名空间std;增加了字符串类型string等。
　　虽然Ｃ＋＋仍然允许使用从Ｃ继承来的传统用法，但建议大家从一开始就按照Ｃ＋＋标准编写程序，养成Ｃ＋＋的编程风格。本博客程序形式如下：
　　#include<iostream>             //头文件不带后缀.h
      #include<string>                 //包含string头文件
        using namespace std;        //使用系统库时使用命名空间std
        int main()                         //主函数为int类型
      {   ```
        string str;                         //定义字符串变量str
           ```　
     return0;                            //程序正常执行则返回０
       }
依据Ｃ＋＋标准介绍的．<img src ="http://www.cppblog.com/shu-64/aggbug/2898.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shu-64/" target="_blank">SHUIGANG</a> 2006-01-19 12:56 <a href="http://www.cppblog.com/shu-64/archive/2006/01/19/2898.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>