天天看點

【C++ Primer】第四章學習筆記 (複合類型)

一,數組

     1,數組隻有在定義時候才能使用初始化,不能将一個數組賦給另一個數組。

           int  a[4]={1,2,3,4};//正确

           int  a[4];

           a[4]={1,2,3,4};//不正确

           int  b[4]=a;//不正确

     2,初始化數組時候,提供少于數組元素數目的部分數值,則将剩餘指派為0;

            float   a[5]={1,2};

     3,如果初始化數組時候,方括号内[ ]為空。C++編譯器将計算元素個數。

           short   a[ ]={1,2,3,4,5};

           int  number=sizeof(a)/sizeof(short);//計算元素個數(可見字元個數)

           char a[ ]={'a','b','c','d','e'};//必須是char 類型的 字元串

           strlen(a);//計算可見字元串個數

二,字元串

     1,字元串結尾字元為'\0'(ASCII碼為0)

            char   a[5]={'a','b','c','d','e'};// 純字元數組,最好不要當做字元串處理

            char   a[5]={'a','b','c','d','\0'};//結尾為空字元,可以當做字元串處理

            char   a[15]="I am a student";//系統自動在最後一個字元加上'\0';

            char   a[]="I am a student";//系統自動算字元個數

       【remember】确定字元串所需最短數組時候,不要忘記結尾空字元串。

                              "s" 表示兩個字元  's'和'\0';

     2,字元串輸入:面向行輸入getline()

          char a[20]; //必須為char類型的  字元數組

          cin.getline(a,20);//将使用者輸入的字元 讀入到一個包含20個元素的  a數組中。

          cout<<strlen(a);//輸出輸入字元個數

     如果輸入的字元多于19個(1個'\0'),geline僅僅取前19個字元。而多于的不會留在輸入隊列中(差別與get())

     3,字元串輸入:面向行輸入get()

           char a[2];

           char b[2];

           cin.get(a,2);

           cin.get(b,2);

           cout<<strlen(a)<<endl;

           cout<<strlen(b)<<endl;

        輸入:abcd 

        輸出:1   1     如果是getline()則輸出:1   0

     get()取的是n-1個可見字元,數組聲明為 n 則讀取n-1字元,最後一個設定為'\0';遇到換行符則将其留在輸入隊列。

     第二次調用cin.get()讀取第一個字元為  換行符。

     【難點】兩個cin 為何隻允許輸入一次??   

                        char a[5];

                   cin.get(a,5);

                   cin.get();   //讀取輸入隊列中換行符并丢棄。防止下次讀換行符時認為結束而終止。造成第二次不能輸入

                   cout<<a[1]<<endl; 

                    char b[5];

                    cin.get(b,5);

                    cout<<b[0]<<endl;

 三,string類型

        1,連接配接兩個字元串

              string  str1,str2,str3;

              str3=str1+str2;

              /*上面是C++做法,下面是C語言做法*/

              strcpy(str3,str1);//将str1複制到str3中

              strcat(str3,str2);//将str2添加到str1中

         2,未被初始化的字元數組,第一個空字元出現的位置是随機的。

              char a[10];

              cout<<strlen(a);

              輸出   4   //0-9  随機

 四,結構類型

         1,struct 用法

            struct  node

            {

                    int    data;

                    node   *next;

            }p1;//聲明結構類型的變量

          2,共用體  union

            一種資料結構格式存儲不同結構類型,但是每次隻能使用一個類型。

           struct node

           {

                 int     data;

                 union   id

                {

                         long    id_num;

                         int       id_num;

                }

                 node *next;

             }p1;//

      /*一點了,該睡覺了……未完待續*/

--------------------------------------------------------------------------------------------------------------

     /*元旦三天假期,偷懶了一下。繼續奮戰*/

          3,枚舉   enum

                用法:enum   枚舉名{所包含的元素};

                           預設枚舉值: enum   name{red,orange,yellow,green,blue}//預設,red=0;orange=1;yellow=2……

                           設定枚舉值:enum   name{one=1,two=2,four=4,a,b};//預設指定值  four之後,a=four+1=5;b=6

                 聲明變量:name   band;

                                    band=red;//valid     在不進行強制轉換情況下,隻能将定義枚舉時使用的枚舉量賦給這種枚舉的變量

                                    band++;  //invalid   沒有為枚舉定義算術運算

                                    band=2;  //invalid    将整型指派給枚舉類型将導緻類型錯誤

                                    int color=2+red// valid   結果為int型,2

                                    band=band(2);//按照{two=2} band=two; 可以通過強制轉換的方式 将整型 轉化為 枚舉類型

           4,指針和自由存儲空間

                 1)用法:    int     a=6;

                                 int   *p;//  ‘*p’  表示存儲在p位址處的值

                                 p=&a;//指針為p,存儲的是值的位址,而不是值本身。  

                                或者寫為:int*  p=&a;//将指針 p的值設定為&a 而不是将 *p的值

                2)指針的危險

                                long  * length;

                                *length=25365;//length 确實是一個指針,但是沒有說明指向哪裡,原因是沒有初始化指針length

                3) new/delete申請與釋放記憶體

                                int  * pn=new  int ;//配置設定int型記憶體,然後把該記憶體塊位址指派給指針

                                 *pn=100;//給聲明的記憶體單元指派

                                delete   pn;//釋放pn指向的記憶體單元,不會删除pn指針本身(pn可以指向另一個新配置設定的記憶體塊)

                              【注意】不要嘗試釋放已經釋放的記憶體塊,delete  pn;之後再delete pn 會有意想不到的錯誤

                                             不能使用delete釋放聲明變量所獲得的記憶體(隻能釋放new申請的)int  *p=&a;//不能delete

                 4)new建立動态數組

                               int  *a=new  int[100];

                               delete  [] a;//[]告訴程式釋放的是數組

                              【原則】

                                           不要使用delete釋放不是new配置設定的記憶體

                                           不要使用delete釋放同一個記憶體塊兩次

                                           如果使用new[ ]為數組配置設定記憶體,則應使用delete[ ]來釋放

                                           如果使用new 為變量配置設定記憶體,則應使用delete來釋放記憶體,對空指針應用delete是安全的

五,指針、數組和指針算術

         1,double  a[3]={100,200,300}; 

               double  *p=a;//p指針指向的是數組a的第一個元素的位址

               cout<<"位址為:"<<p+1<<"存儲的值為:"<<*(p+1)<<endl;//輸出的是a[1]的位址和a[1]的值

               說明:p+1  增加的量等于 p指針指向類型的位元組數(double  8位元組)

                           C++将數組名解釋為數組第一個元素的位址

        2,sizeof作用于 數組顯示數組占用的位元組數,作用于指針顯示指針長度

              程式:

#include "stdio.h"

int main()

{

double a[3]={100.0,200.0,300.0};

double *p=a;

printf("顯示數組占用位元組數:%d\n",sizeof(a));//輸出24=3*8

printf("顯示指針個數:%d\n",sizeof(p));//輸出4=3個可見元素加上一個結束符

}

        3,數組名是第一個元素位址,但是cout對象認為char 數組的位址為字元串位址

#include "stdio.h"

#include <iostream>

using namespace std;

int main()

{

double a[3]={100.0,200.0,300.0};

char b[5]="rose";

cout<<"列印double型數組名a:"<<a<<endl;//輸出數組第一個元素位址

cout<<"列印char型數組名b:"<<b<<endl;//輸出字元串

}

        cout 輸出char數組時,從第一個字元元素輸出一直到遇到空字元'\0'

       4,不要使用常量和未被初始化的指針來接受輸入

             char  *p;

             const  char  *a="rose";

             cin>>p;//不正确

             cin>>a;//不正确

      5,一個使用new和delete的程式範例

char *getname();

char *name;

name =getname();

cout<<name<<" at "<<(int *)name <<endl;

delete []name;

char *getname() //如果要建立大量數組的時候,可以根據要存儲變量的大小動态配置設定記憶體大小

char temp[80];

cout<<"Enter last name:";

cin>>temp;

char *pn=new char[strlen(temp)+1];

strcpy(pn,temp);

return pn;

程式說明:兩次輸出的位址是一樣的。如果去掉delete []name 則 已經使用但未被釋放的位址無法使用