程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 【C++ Primer】第四章學習筆記 (復合類型)

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

編輯:C++入門知識

一,數組

     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作用於 數組顯示數組占用的字節數,作用於指針顯示指針長度

              程序:

[html]
        #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 數組的地址為字符串地址

              程序:

              

[html]
#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的程序范例

[html]
#include "stdio.h" 
#include <iostream> 
using namespace std; 
char *getname(); 
int main() 

    char *name; 
    name =getname(); 
    cout<<name<<" at "<<(int *)name <<endl; 
    delete []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 則 已經使用但未被釋放的地址無法使用


摘自 小田的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved