一,數組
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 則 已經使用但未被釋放的地址無法使用
摘自 小田的專欄