代码改变世界

基础复习笔记--数据类型

2008-01-09 23:25  libiver  阅读(152)  评论(0编辑  收藏  举报

     下面是我复习过程中的一些笔记,比较凌乱。不过还是贴上来,算是自己学习的一个过程的记录吧

 

1、关于cout打印int整形数和char字符串的区别:

   egint a = 25

       cout<<a<<endl;

在这里,我们要知道整数25和字符串25在存储上的区别,字符串”25”在程序的内部是分别存储’2’‘5’这两个字符的编码(ASCLL编码),所以cout只需要打印字符串中的各个字符即可,而整数25在程序的内部存储的是25这个数值的二进制数,不是单独的25。所以在打印之前,cout必须将整数形式的数字转换成字符串形式再打印。

在比较printfcout之后,我们可以发现,cout的聪明程度比printf要高。在printf输出的时候,我们要指定输出的是什么类型,如%d表示输出整形。而cout就不需要这些了,因为它是对<<这个操作符重载了。是一种智能设计。同样cin也是这样的。

 

 

2sizeof()操作的是字节数。

   eg: sizeof(int) = sizeof(float) = 4;

      int nArray[4] = {1,2,3,4};

      sizeof nArray = 16; // sizeof()对数组是得到整个数组的大小

      sizeof nArray[0] = sizoeof(int) = 4;

     

        float var = 9.0;

          char ch = 'w';

          double dVar = 5.326;

          double * pdVar = &dVar;

          char * pch = &ch;

          float * pfVar = &var;

        

          cout<<var<<endl

                 <<&var<<endl

                 <<pfVar<<endl

                 <<pnVar<<endl

                 <<* pnVar<<endl

                 <<*pfVar<<endl

                 <<sizeof var<<endl   // 4

                 <<sizeof ch<<endl    // 1

                 <<sizeof dVar<<endl  // 8

          <<sizeof(string)<<endl // 32

                 <<sizeof(void*)<<endl// 4

                 <<sizeof pch<<endl   // 4

                 <<sizeof pdVar<<endl // 4

          <<sizeof nArray<<endl// 16,数组名就是数组的首地址,也是一个指针

                 <<sizeof pfVar<<endl // float*=  4 byte

                 <<sizeof pnVar<<endl // int * =  4 byte

                 <<sizeof var<<endl   // float =  4 byte

                 <<sizeof(int)<<endl;  // int   =  4 byte

 

    由上面可以得到一个结论,那就是指针内存大小为4byte(但用sizeof(arrayName)得到的是数组的总大小)

 

3char是一种整形,char占一个字节的大小(8bit),也正是因为这样所以我们可以像整形数那样去对char进行操作,如加1

 

4、特殊的初始化

   对于数组的初始化,

  int nNum[4] = {1,2,3,4}; // okay

     int nArray[4];         //okay

     nArray[4] = {1,2,3,4};   // not allowed

     nArray = nNum;       // not allowed

  float fArray[5] = {1.5,2.3};//okay

     如果只是对数组进行部分初始化,则数组是从左到右来匹配,并且数组自动将其他的元素设置为0。所以要将数组全部初始化为0很简单,只需要将数组的第一个元素初始化为0即可。egchar cArray[200] = {0};

 

  注:对于带参数列表的函数,必须从右向左添加默认值。也即要为某个参数设置默认值,则必须为它右边的所有参数提供默认值。

   egint fun1(int n, int m = 4, int k = 7);     // okay

       int fun2(int n, int m = 4, int k );       // invalid

       int fun3(int n = 2, int m = 9, int k = 6);  // okay

 

 5 string        

     C++有两种处理字符串的方式,一种来自C语言,我们称为C-风格字符

(C-style string);另一种是基于string类库的字符串。

     C-sytle string有一个性质就是:以空字符(null character)结尾,空字符被写

/0ASCII码为0,用来标记字符串的结尾。

     eg: char cName[7] = { L,e,e,z,h,m,/0}; // 显式加入/0

        char cName[7] = Leezhm;  // 隐式包含/0

 

 

 注意:字符常量和字符串常量的区别:

      eg: char ch = e;  //  ascii = 83

         char ch = e;  // e’’/0 所有这样是非法的,e是一个串

,返回字符串的字符个数,

注意不包括/0字符。

    

字符串的输入,面向行的输入:

     getline()getline是通过回车键输入的换行符来确定输入结尾。

     get()get有几种变体,其中有一种与getline工作方式一样。

egchar ch[20];

cin.getline(ch, 20);

 

char name[20];

char address[50];

cin.get(name, 20);

cin.get(address, 50); // 这个时候会出现错误,因为get读到行尾时,它丢弃换行符,// 并将它留在输入队列中,所以在我们两次输入时,第二次

// 得到的第一个字符便是换行符。

修改方法为:cin.get(name, 20);

            cin.get(); //利用这种不带参数可以读起下一个字符

cin.get(address, 50);

或:        cin.get(name, 20).get();

            cin.get(address, 50);

 

String class

String类位于std名称空间中,它是标准的库(ISO/ANSI C++ 99)。我们可以将它当成一个基本的变量一样使用。String类的设计让程序能够自动处理string变量的大小。

egstring str

    str = hello!;

    str = welcome;

由上面可以知道string类的赋值、拼接和附加变得很容易。

关于stringcopycompare等具有见string class介绍。

String的输入:getline(cin, str);