一,數組
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 則 已經使用但未被釋放的位址無法使用