博文

又是指针和数组(2008-03-06 14:49:00)

摘要:#include <stdio.h>
int main()
{
 int a[5]={1,2,3,4,5};
 int i;
 int *ptr=(int*)(&a+1);
 printf("ptr=%p\n",ptr);
 for(i=0;i<5;i++)
  printf("%p\n",a+i);
 printf("%d,%d\n",*(a+1),*(ptr-1));
} 以下是输出 ptr=0013FF64
0013FF50
0013FF54
0013FF58
0013FF5C
0013FF60
2,5 哎,想了半天才发现是&a+1而不是a+1真是粗心啊!......

阅读全文(2190) | 评论:0

指针趣事(2007-09-18 23:53:00)

摘要:       今天是个大晴天,温暖的阳光透过窗子照进了这间宽敞的办公室,办公室里三三两两的人们正在各自的计算机前努力工作,一切都显得那么的安静、祥和、有条不紊 …… “啊~!救命啊!Solmyr 你又用文件夹砸我!” “愚蠢者是应该受到惩罚的。” 画外音: …… 呃,好吧,我得承认有点小小的例外。这里是一家软件公司,发出惨叫的这位是 zero ,新进的大学生;这边一脸优雅,看上去很有修养一点也不象刚刚砸过人的这位,是 Solmyr ,资深程序员,负责 zero 这一批新人的培训。啊,故事开始了 …… “我干了什么啦?”zero 揉着鼻子问道,“这次你拿来砸我的文件夹又大了一号!” “你过来自己看看你犯下的错误。”Solmyr 翻出了 zero 刚刚交上来的一段代码: ……
char* msg = “Connectting ... Please wait“
……
if( Status == S_CONNECTED )
strcpy(msg, “Connectted“);
…… “我犯了什么错误啦?这是一个很平凡的字符串声明而已”,zero 不满的说到。 “你看不出来吗?connect 这个单词的进行时和过去时你都拼错了,多打了一个 t”,Solmyr 不紧不慢地回答。 “就为了这个你又用文件夹砸我 …… 啊!这次又是光盘盒!” “这是商用软件,你以为是在 QQ 上和 PPMM 聊天,有错别字不要紧啊?更糟糕的是,我故意留了这么长的时间给你,到现在你还没发现你真正的错误在什么地方。你可真不是一般的菜啊~”,Solmyr 故意拖了个长音,满意的看到 zero 处于爆发的边缘,“好吧,让我们从基础开始,C 语言中是怎样处理字符串的?” “这个我知道”,zero 显得很有自信,“C/C++ 语言中,字符串是一段连续的字符型内存单元,每个单元存放一个字符,并用 \0 作为结尾的标记。” “那么使用指针之前,我们应当 ……” “我们应当保证这个指针指向合法的内存,要么指向一块已经存在的内存,要么为它动态分配一块。”,zero 开始露出得意的笑容 —— 这种程度的问题,哈! “好!那么你的代码中 msg 这个指针指向哪里?”......

阅读全文(2053) | 评论:0

Key Concept: Polymorphism in C++(2007-09-05 22:35:00)

摘要:The crucial point about references and pointers to base-class types is that the static typethe type of the reference or pointer, which is knowable at compile timeand the dynamic typethe type of the object to which the pointer or reference is bound, which is knowable only at run timemay differ. The fact that the static and dynamic types of references and pointers can differ is the cornerstone of how C++ supports polymorphism. When we call a function defined in the base class through a base-class reference or pointer, we do not know the precise type of the object on which the function is executed. The object on which the function executes might be of the base type or it might be an object of a derived type. If the function called is nonvirtual, then regardless of the actual object type, the function that is executed is the one defined by the base type. If the function is virtual, then the decision as to which function to run is delayed until run time. The version of the virtual functi......

阅读全文(2853) | 评论:1

关于虚函数表的一点内容(2007-07-26 00:37:00)

摘要:



还是用图表和代码能说明内容: #include <iostream>
using std::cout;
using std::endl; class Base
{
public: //为了便于取地址
    int m_data1;
    int m_data2;
    int m_data3;
public:
    void mem_fun1();
    void mem_fun2();
    //注意虽然后面没用到这些虚函数 ,但是要使程序可以编译通过
    //需要实现他们,因为建立vtable会出错
    virtual void vir_fun1(){}
    virtual void vir_fun2(){} 
};    class Derive:public Base
{
public://为了便于取地址
    int m_data1;
    int m_data3;
    int m_data4;
public:
    void mem_fun1();
    virtual void vir_fun2(){}         
}; int main()
{
    cout<<"sizeof(Base)=> "<<sizeof(Base)<<endl;
  &nbs......

阅读全文(2861) | 评论:1

派生类的拷贝构造函数(2006-12-25 19:29:00)

摘要:刚刚弄了一个关于派生类的实验,里面涉及到了派生类的拷贝构造函数,这时才发现自己在这个知识点上还很模糊。在CSDN上面看了下相关的一篇文章后,稍微有了点感觉。现总以一个例子总结如下: 情况(1).  派生类的copy   constructor未定义 #include   <iostream>  
  using   namespace   std   ;  
   
  class   base  
  {  
  public:  
  base()   {   cout   <<   "base::base()"   <<   endl   ;   }  
  base(   const   base&   )   {   cout   <<   "base::base(   const   base&)"   <<   endl   ;   }  
  virtual   ~base()   {   cout   <<   "base::~base()"   <<   endl&n......

阅读全文(3619) | 评论:1

指针与数组(2006-08-28 15:18:00)

摘要:    这是一个看似简单,但却不是那么容易搞清楚的问题。以下是在Andrew Koenig的杰作中看到的一些关于数组和指针的讲解,我只作了部分整理。
    C语言中指针与数组这两个概念之间的联系是如此密不可分,以至于如果不能理解一个概念,就无法彻底理解另一个概念。
C语言中的数组值得注意的地方有以下两点:
1:C语言只有一维数组,而且数组的大小必须在编译期就作为一个常数确定下来。然而,C语言中数组的元素可以是任何类型的对象,当然可以是另外一个数组,这样啊,要“仿真”出一个多维数组就不是一件难事。(C99标准允许变长数组(VLA)。GCC编译器实现了变长数组,但是细节与C99标准不完全一致。)
2:对于一个数组,我们只能够做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。其他关于数组的操作,哪怕他们看上去是以数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。一旦我们彻底理解这两点以及他们所隐含的意思,那么理解C语言的数组运算不过就是“小菜一碟”。

    对于指针加上一个整数,与给该指针的二进制表示加上同样的整数,两者的含义截然不同,这点大家应该都是清楚的。

下面一个问题是关于指针加减问题的:
    如果两个指针指向的是同一个数组中的元素,我们可以把这两个指针相减,这样是有意义的,例如:int *q=p+i;我们可以通过q-p而得到i的值。值得注意的是如果他们指向的不是同一个数组的
元素,即使他们所指向的地址在内存中的位置正好间隔一个数组元素的整数倍,所得的结果仍然是无法保证其正确性的。至于指针相加的情况暂时好象没有发现有。

    现在定义一个数组int a[3];如果我们在应该出现指针的地方,却采用了数组名来替换,那么数组名就被当作指向该数组下标为0的元素的指针,这点大家也都很清楚。但是要注意一点,除了a被用做运算符sizeof的参数这一情......

阅读全文(2537) | 评论:0

指针数组和数组指针(2006-08-23 01:00:00)

摘要:这个问题大家应该都碰到过,指针数组和数组指针,刚开始看时觉得还是能看懂,但是过些时又搞混了,最后发现还是没有真正理解。 下面就简单说说这两个概念:
一:指针数组,顾名思义,就是说的首先是一个数组吧,然后数组的元素是指针而已。
说明形式为:type *pointer_array[constant1][constant2]...[constantn];
例如:int *pai[3];
由于‘*’是自右向左结合,因此从右向左看,首先看到[4]说明是一个数组,是一个包含4个元素的数组,然后看到‘*’,显然是指针类型,由此可以看出数组中存放的是指针而不是一般的类型。同理,char *pac[2][3]是包含有6个元素,每一个元素都是一个字符型指针。再来说说他们的初始化:
int *pai[3];既然是一个包含4个整形指针的数组那么其对应的将是一个二维整形数组,因为一个整形指针对应一个一维整形数组。
那我就用一个二维整形数组来初始化它,事实上一般也都是这么做的,这里有一个二维数组,int arr[3][2]={{1,2},{3,4},{5,6}},一个三行两列的整形数组,注意这里的行必须和你的指针数组的维数一致,否则是不允许的,不信你可以试试。
这个初始化有很多种选择,以下只列举常见的两中:
第一种也是很好理解的:
for(int i=0;i<3;i++)
  pai[i]=arr[i];
显然arr[i]是每一行的首地址,相当于一个一维数组的数组名,如是把它送给一个整形指针pai[i]是理所当然的了。
第二种方法:
在说明指针数组时就初始化:int (*ap)[2]={{1,2},{3,4},{5,6}};哈哈这个不用说了吧。 注意:不能将二维数组的数组名赋给指针数组的数组名,pai=arr(错),因为两者的类型不一致,二维数组名的类型是指向int[][]型的指针,而指针数组的的数组名是指向int *[]类型的指针。 在c/c++语言中,指针数组最常用的场合就是说明一个字符串数组。即说明一个数组,它的每个元素都是一个字符串。 二:数组指针:指向一个数组的指针。
说明形式为:type (*pointer_array)[constant1][constant2]...[......

阅读全文(23784) | 评论:7

C++头文件(2006-07-12 19:01:00)

摘要:      学了两天 C++了,基础部分基本上看了一遍,用到一些编译器时发现里面的头文件不一样,有的有后缀名而有的没有后缀名。后来上网看了下才发现好象是标准C++头文件没有后缀名,以下是在网上找到的C++头文件一览: 传统 C++   #include <assert.h>    //设定插入点  
 
  #include <ctype.h>         //字符处理   #include <errno.h>         //定义错误码   #include <float.h>         //浮点数处理   #include <fstream.h>       //文件输入/输出   #include <iomanip.h>       //参数化输入/输出   #include <iostream.h>   //数据流输入/输出   #include <limits.h>    //定义各种数据类型最值常量   #include <locale.h>    //定义本地化函数   #include <math.h>     //定义数学函数   #include <stdio.h>     //定义输入/输出函数   #include <stdlib.h>    //定义杂项函数及内存分配函数   #include <string.h>    //字符串处理   #include <strstrea.h>   //基于数组的输入/输出   #include <time.h>     //定义关于时......

阅读全文(2575) | 评论:0

学C++了(2006-07-11 10:03:00)

摘要:    haha,终于开始学C++了,马上就是大三了,好象好多学校大一或者大二就开始学C++了,不能等到课堂上再学了,趁这个暑假一定要先看看。还好前面的语法部分基本上不用看,大一学过C,上学期学数据结构又把C几乎是学了遍,后面的面向对象部分应该是这段时间的重要部分,幸运的是大二上学期又学过java(当时我也不知道学校为什么要把它当选课)不过现在好象没什么印象了。
    我打算每天看三集视频教程,然后看下自己买的自认为经典的什么国外教程,至于上机练习什么时候心血来潮就上下,主要问题还是想玩会游戏,所以不知道一个暑假后自己能学到什么,期待中……。......

阅读全文(2982) | 评论:2

C中的字符数组(2006-05-07 14:15:00)

摘要:   今天是五一的最后一天了,这个五一哪都没去,玩的也一般般,上午终于把那个数据结构的实验程序搞定了,说来真是惭愧,这么久了才弄完,主要是自己心思没用放在上面(这些天一直在玩游戏)。
   这个实验程序大家应该都做过的就是那个魔王语言翻译的,通过这个程序又发现了自己程序设计的不少有待改进的地方,感受最深的是其中的字符数组使用的部分现在趁这个机会自己也好好总结下。
   顾名思义字符数组就是用来存放字符数据的数组,其中一个元素存放一个字符。光这样说太枯燥了来看看这个程序吧:
#include <stdio.h>
#include <conio.h>
main()
{
    char a[10],b[10];
    int i;
    clrscr();
    gets(a);
    for(i=0;a[i]!='\0';i++)
    b[i]=a[i];
    printf("i=%d,blen=%d\n",i,strlen(b));
    puts(b);
         getch();
}
大家都可以看出这是一个非常简单的程序,首先你认为这个程序有没有问题呢?当然这个程序的语法是没有任何错误的,但运行后的结果会是怎么样的呢?以下是我在tc2.0下的运行结果:
journey
i=7,blen=15
journey????????
上面的8个?是代表的乱码,为什么结果会是这样的呢,而且blen为什么是15呢?如果记得C中的字符数组的......

阅读全文(2892) | 评论:0