Visual C++ 2008入门经典 第四章数组 字符串
生活随笔
收集整理的這篇文章主要介紹了
Visual C++ 2008入门经典 第四章数组 字符串
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*
//學習內容
數組及其使用方法
如何聲明和初始化不同類型的數組
如何聲明和使用多維數組
指針及其使用方法
如果聲明和初始化不同類型的指針
數組和指針之間的關系
引用的概念及聲明方法,關于使用引用的幾點初步建議
如何在本地C++程序中給變量動態分配內存
如何在CLR程序中動態分配內存
跟蹤句柄和跟蹤引用的概念,CLR程序中需要它們的原因
如何在C++/CLI程序中處理字符串和數組
內部指針的概念,創建和使用內部針的方法4.1 處理多個相同類型的數據值4.1.2 聲明數組#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{const int MAX = 20;double gas[MAX];long miles[MAX];int count = 0;char ch = 'y';while((ch=='Y' || ch=='y') && count < MAX){cout<<"氣油的價格:";cin>>gas[count];cout<<endl;cout<<"請輸入miles數值:";cin>>miles[count];count++;cout<<"是否繼續執行(y/n)"<<endl;cin>>ch;}if(count <= 1){cout<<"對不起,沒有有效數據"<<endl;return 0;}for(int i=1; i<count; i++){cout<<setw(2)<<i<<" . ";cout<<" Gas purchased = "<<gas[i]<<" gallons ";cout<<((miles[i]-miles[i-1])/gas[i])<<" miles per gallon.";cout<<endl;}system("pause");return 0;
}*///4.3.1 初始化數組/*#include "stdafx.h"#include <iostream>#include <iomanip>using namespace std;int main(){int value1[5]={1,2,3};int value2[5];for(int i=0; i<5; i++){cout<<setw(2)<<value1[i]<<" ";}cout<<endl;for(int i=0; i<5; i++){cout<<setw(2)<<value2[i]<<" ";}cout<<endl;system("pause");return 0;}//4.1.4 字符數組和字符串處理//注意:字符串中每個字符占用一個字節,因此算上最后的空字符,字符串需要的字節數要比包含的字符數多一個//wchar_t president[] = L"Ulysses Grant";前綴L表示字符串字面值是一個寬字符串,因此字符串的每個字符(包括終止空字符)都會占兩個字節,當然,對字符串的索引會引用字符,而不是字節 1 字符串輸入const int MAX = 80;char name[MAX];cin.getline(name,MAX,'\n');name: char[]類型數組的名稱,從cin讀取的字符存儲在該數組中MAX: 要讀取的字符的最大數量,當讀取了最大數量的字符數后,停止輸入'\0': 結束輸入過程的字符,在此可以指定任一字符,且該字符在首次出現時就將結束輸入過程
*/
/*#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{const int AMX = 80;char buffer[AMX];int count=0;cout<<"請輸入一串字符:"<<endl;cin.getline(buffer,AMX,'\n');while(buffer[count] !='\0'){count ++;}cout<<"輸入的字符串為:"<<buffer<<" 長度為:"<<count<<endl;system("pause");return 0;
}*///4.1.5 多維數組//1初始化多維數組
/*#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{//int ch[3][4]={0};//char ch[3][4] = {s}; //這里默認聲明字符串數組好像不行char ch[3][4] = {'s','v','v','t','s','v','t','e','s','v','t','e'}; //注意:數組中有多少維,初值組就需要多少層嵌套的大括號,這句話么意思哦,不懂啊 是等號右邊嗎?不行哦for(int i=0; i<3; i++){cout<<setw(2)<<i;for(int j=0; j<4; j++){cout<<setw(2)<<ch[i][j]<<" ";}cout<<endl;}system("pause");return 0;
}#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{char ch[][80]= {"Robert RedFord","Gioakibg Cassudt","Lassie","Slim Pickens","Boris Karloff","Oliver Hardy"}; //注意:數組中有多少維,初值組就需要多少層嵌套的大括號,這句話么意思哦,不懂啊 是等號右邊嗎?不行哦int i;cout<<"請輸入1 to 6 數字:";cin>>i;if(i>=1 && i<=6){cout<<"ch["<<i<<"]:"<<ch[i-1]<<endl;}else{cout<<"輸入的值不合法"<<endl;}system("pause");return 0;
}*///4.2 間接數據存取//4.2.1 指針的概念//4.2.2 聲明指針//long * pnumber;//long *pnumber;//long* pnumber, number = 99;//操這里蛋疼了,pnumber是long型的指針,而number只是一個long型的變量,//在C++中,使用以字母p開始的變量名表示指針的通用慣例,這使我們能更容易看清程序中哪里些變量是指針,從而使程序更易于理解//取地址運算符//我們需要的是取地運算符符&,該運算符是一元運虎符,用于獲得變量的地址,又名引用運算符。//pnumber = &number;//4.2.3 使用指針//1 間接運算符//2 需要使用指針的原因
/*#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{long* pnumber = NULL;long number1 = 55, number2=99;pnumber = &number1;*pnumber +=11; //66cout<<"number1:"<<number1<<endl;cout<<"&number1="<<hex<<pnumber<<endl;pnumber = &number2; //99number1 = *pnumber * 10; //990//number1=990cout<<"number1="<<dec<<number1<<endl; //990cout<<"pnumber="<<hex<<pnumber<<endl;; //99cout<<"*pnumber="<<dec<<*pnumber<<endl;; //99system("pause");return 0;
}*///*pnumber +=11;//間接運算符使我們將pnumber所指變量--number1的內容加上班11,如果忘記在這條語句中寫上*號,則計算機將使該指針存儲的地址加上11//那不就是內存地址的加11//4.2.4 初始化指針//int* pnumber = NULL;//if(pnumber == NULL) cout<<"pnumber is null.";//int* pnumber = 0;//if(pnumber == NULL) cout<<"pnumber is 0.";//if(!pnumber){ cout<<"pnumber is null."}//NULL指針指向的地址包含無用數據,我們永遠不應該解除對某個空指針的引用,因為那樣將使程序立即終止//1 指向char類型的指針//char * proverb = "A miss is as good as a mile";//看起來類似初始化char數組,但二者細微的區別,這條語句用引號之間的字符串創建某個以/0終止的字符串字面值(實際上是const char類型的數組),并將該字面值的地址存儲在指針proverb中,該字面值的地址將是其第一個字符的地址/*#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{char* pstr1 = "Robert Redford";char* pstr2 = "Hopalong Cassidy";char* pstr3 = "Lassie";char* pstr4 = "Slim Pickens";char* pstr5 = "Boris Karloff";char* pstr6 = "Oliver Hardy";char* pstr = "Your lucky star is ";int dice = 0;cout<<"Pick a lucky star 1 and 6:";cin>>dice;switch(dice){case 1: cout<<pstr<<pstr1<<endl;break;case 2: cout<<pstr<<pstr2<<endl;break;case 3: cout<<pstr<<pstr3<<endl;break;case 4: cout<<pstr<<pstr4<<endl;break;case 5: cout<<pstr<<pstr5<<endl;break;case 6: cout<<pstr<<pstr6<<endl;break;default:cout<<"sorry 輸入的值不正確"<<endl;break;}//輸出指針指向的字符串簡單得不能再簡單了,//顯示出來的是該指針包含的地址,為里卻不同呢,//在于輸出操作看待char*類型指針的方式,輸出操作以一種特殊的方式來看待這種類型的指針,即將其視為字符串(即char數組)//因些輸出字符串本身,而不是字符串的地址system("pause"); return 0;
}*//*
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{char* pstr[] ={ "Robert Redford","Hopalong Cassidy","Lassie","Slim Pickens","Boris Karloff","Oliver Hardy",};char* pFirstStr = "Your lucky star is ";int dice = 0;cout<<"Pick a lucky star 1 and 6:";cin>>dice;if(dice >= 1 && dice <= 6){cout<<pFirstStr<<pstr[dice-1]<<endl;}else{cout<<"sorry 輸入的值不正確"<<endl;}//輸出指針指向的字符串簡單得不能再簡單了,//顯示出來的是該指針包含的地址,為里卻不同呢,//在于輸出操作看待char*類型指針的方式,輸出操作以一種特殊的方式來看待這種類型的指針,即將其視為字符串(即char數組)//因些輸出字符串本身,而不是字符串的地址system("pause"); return 0;
}*///4.2.5 sizeof運算符//cout<<(sizeof pstr)/(sizeof pstr[0])//記住,pstr是一個指針數組,對該數組或元素使用sizeof運算會不能獲得任何文本字符中內存占用情況
/*#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{char* pstr[] ={ "Robert Redford","Hopalong Cassidy","Lassie","Slim Pickens","Boris Karloff","Oliver Hardy",};char* pFirstStr = "Your lucky star is ";int count = (sizeof pstr) / (sizeof pstr[0]);cout<<"count:"<<count<<endl;//這里計算一共有多省個字符串int dice = 0;cout<<"Pick a lucky star 1 and "<<count<<":";cin>>dice;if(dice >= 1 && dice <= 6){cout<<pFirstStr<<pstr[dice-1]<<endl;}else{cout<<"sorry 輸入的值不正確"<<endl;}//輸出指針指向的字符串簡單得不能再簡單了,//顯示出來的是該指針包含的地址,為里卻不同呢,//在于輸出操作看待char*類型指針的方式,輸出操作以一種特殊的方式來看待這種類型的指針,即將其視為字符串(即char數組)//因些輸出字符串本身,而不是字符串的地址system("pause"); return 0;
}*///4.2.6 常量指針和指向常量的指針//const int count = (sizeof / pstr) / (sizeof pstr[0])
//#include "stdafx.h"
//#include <iostream>
//#include <iomanip>
//#include <string>
//#include <cstring>
//using namespace std;
//int main()
//{/*char* pstr[] ={ "Robert Redford","Hopalong Cassidy","Lassie","Slim Pickens","Boris Karloff","Oliver Hardy",};*///char* pFirstStr = "Your lucky star is ";//修改pstr[0]所指向的字符內容//pstr[0]="Xlc";//cout<<pstr[0]<<endl;//cout<<*pstr[0]<<endl;//*pstr[0] = "Stan Laurel"; //書上說這樣不可以編譯,但我這里卻可以//*pstr[0] = 'x'; ///*const char* pstr[] ={ "Robert Redford","Hopalong Cassidy","Lassie","Slim Pickens","Boris Karloff","Oliver Hardy",};*///指針數組的元素指向const字符串,如果我們現在試圖修必這些字符串,則次被編譯器在編譯時標記為錯誤//*pstr[0] = 'x'; 不可以修改//當然,我們仍然可以合法地編寫下面的語句//pstr[0] = pstr[1];//注意,這條語句并沒有改變指針數組元素指向的對像的值,改變的只是pstr[0]中存儲的指針的值,我們應該禁止這種修改,/*const char* const pstr[] ={ "Robert Redford","Hopalong Cassidy","Lassie","Slim Pickens","Boris Karloff","Oliver Hardy",};*///總之,我們應該區分下面這三種const,指針及指針指向的對像有關的情形//指向常量對像的指針//const char* pstr[]={};//指向某個對像的常量指針//char* const pstr[]={}//指向常量對像的常量指針//const char* const pstr[]={}//第一種情況,我們不能修改被指向的對像,但可以使指針指向其它對像//const char* pstring = "Some text";//const char* pstring = "Some text";//如果修改指針指向其它對像, 這里需要知道這么回事,但還是不太理解,其它的對像,是指一個"I some text"嗎?//但我用 const char _str[] = "I some text"; 然后賦值給pstring還是不成功//pstring="I some text";//cout<<"pstring:"<<pstring<<endl; // *pstring = "xxdxxd"; 不能修改被指向的對像//第二種情況,我們不能修改指針中存儲的地址,但可以修改指針指向的對像//char* const pstring = "Some text";//常指針就是創建不能移動的固定指針,但是它所指的數據是可以改變的//pstring[0] = 's';// char * const pc ="abcd";// cout <<pc<<endl;// pc[3]='x';// cout<<pc<<endl;//網上指的,也不起做用//pstring = "I Some text"; //不能修改指針中存儲的地址//*pstring = "I some text";//不知道怎么來描述或者說怎么來寫,“可以修改指針指向的對像”//在最后一種情況下,指針和被指向的對像都被定義成常量,因此都不能被修改//const char* const pstring="Some Texst";//4.2.7 指針和數組//double* pdata;//double date[5];//則可以進行下面的賦值操作//pdata = data;//該語句將數組data中第一個元素的地址賦給指針pdata,單獨使用數組名稱將引用該數組的地址,如果我們使用帶索引仁政的數組名data,//則引用的是對應于索引值的那個元素的內容,因此,如果我們希望將該元素的地址存入指指中,則必須使用取址運算符//pdata = &data[1];//1 指針算術運算//我們可以用指針執行算術操作,在算術方面,我們僅限于加減操作//pdata = &data[2];//這種情況下,表達式pdata+1將是數組data中的第四個元素data[3].因此我們通過下面的這條語句,就可以使指針pdata指向元素data[3]//pdata++;//注意,指針算術運算產生的地址范圍可以從數組第一個元素的地址到最后一個元素之后的第一個地址,如果超出該范圍,則指針的行為是不確定的//對于作為指針算術運算結果的指針來說,我們當然可以解除對它的引用(否則該指針就沒什么用途)//假設pdata仍然指向data[2]//* (pdata+1) = *(pdata+2);//data[3] == data[4]//當我們使某個指針包含的地址遞增之后,又希望解除對該指針的引用時,圓括號是必不可少的,因為間接運算符的優先級高于算述運算符+或-的優先級,如果寫成*pdata + 1 而非*(pdata+1),//則使pdata指向的地址中存儲的數值加1,即等價于執行data[2]+1; 因為該表達式不是一個左值,所以用于前面的賦值語句時將使編譯器生成一條出錯消息/**const int MAX = 100;long primes[MAX] = {2,3,5};long trial = 5;int count = 3;int found = 0;do{trial += 2; //7found =0; //0for(int i=0; i<count; i++){found = (trial % *(primes+i)) == 0;if(found){cout<<"trial:"<<trial<<endl;cout<<"*(primes+i):"<<*(primes+i)<<endl;break;}}if(found == 0)*(primes + count++) = trial;}while(count < MAX);for(int i=0; i<MAX; i++){if(i % 5 == 0)cout<<endl;cout<<setw(10)<<*(primes + i);}*///計算字符的個數/*const int MAX = 80;char buffer[MAX];char* pbuffer = buffer;cout<<"請輸入你要的字符串,最大值為"<<MAX<<endl;cin.getline(buffer,MAX,'\n');//因為指針pbuffer是在while循環中遞增的,發現'\0'字符之后遞增將停止,當發現'\0'字符時,pbuffer將包含字符串中該字符的地址,//因此,輸入的字符串中字符的個數就是指針pubffer中存儲的地址與buffer指示的數組開始地址的差值//這句話很重要,pbuffer將包含字符串中該字符地址,因此,輸入的字符串中字符的個數就是指針pbuffer中存儲的地址與buffer指示的數組開始的地址的差值while(*pbuffer){pbuffer++;}cout<<"the stirng :"<<buffer<<endl;cout<<" has "<<(pbuffer - buffer -1)<<" characters. ";cout<<endl;//注意,我們不能用與使用指針相同的方式使用數組名,表達式buffer++絕對是非法的,因為我們不能修改數組名表示的地址,盡管我們可以在表達式中像使用指針一樣使用數組名,但是數組名不是指針,因為它表示的地址是固定的*/// 2 使用指針處理多維數組//但相對處理多信數組時,事情就變得稍微復雜一些了//double beans[3][4];//我們可以聲明一個指針pbeans//double* pbeans;//pbeans = &beans[0][0]; //我們也可以用下面的語句,將指針設置為數組中第一行的地址//pbeans = beans[0];//但由于beans是二維數組,因此不能用下面的語句設置指針中的地址//pbeans = beans;//問題在于類型不同,前面定義的指針類型是double*, 但是數組beans的類型是double[3][4],//存儲該數組地址的指針必須是double*[4]類型,C++將數組的大小與類型聯系在一起,//上面的語句僅當將指針聲明為要求的大小時才合法,這種聲明形式比前面所介紹的都復雜一些//double (*pbeans)[4];//此處的圓括弧是必需的,否則聲明的將是一個指針數組,前面那條語句現在是合法的,但是該指針只能用來存儲規定大小的數組的地址/*double beans[3][4]={10};double* pbeans = &beans[0][0];cout<<"pbeans:"<<*pbeans<<endl;//將第一行做為存儲地址double* ppbeans = beans[0];*(ppbeans+1)=22; //這樣是個改第一行的第二個值//ppbeans++; 這樣加不行,這樣加是指元素向前提一個 //*(ppbeans+1)=55;//*(*ppbeans+1)=66;//這里還是不知道如何移動到下一次,或者指定下一列的信息cout<<"beans[0][1]:"<<beans[0][1]<<endl;cout<<"beans[0][2]:"<<beans[0][2]<<endl;cout<<"beans[1][1]:"<<beans[1][1]<<endl;*///3: 多維數組的指針形式//使用帶兩個索引值的數組名//使用指針形式的數組名//beans[i][j];//*(*(beans+i)+j);//beans是數組變量值,而不是指針值//我們來看一下工作過程,第一行使用正常的數組索引值,引用數組中第i行偏移量為j的元素//我們可以從內向外確定每樣二行的意義,beans引用數組第一行的地址,因此beans+i引用提數的第i行,//表達式*(beans+i)是第i行的第一個元素的地址,因此*(beans+i)+j是i行中偏大移量為j的那個元素的地址,因此,整個表達式引用的該元素的值/*double beans[3][4]={10};double* pbeans = &beans[0][0];cout<<"pbeans:"<<*pbeans<<endl;//我這里個beans[1][1]的元素值*(*(beans+1)+1) = 55; //大爺的,這里注意是用beans而不是指針變量pbeans去找的cout<<"beans[1][1]:"<<beans[1][1]<<endl;//*(*(beans+i)+j);//我們不建議這樣做,那么可以混合使用數組和指針兩種形式,*(beans[2]+1) = 66;cout<<"beasn[2][1]:"<<beans[2][1]<<endl;(*(beans+1))[2] = 77;cout<<"beans[1][2]:"<<beans[1][2]<<endl;*///4.3動態內存分配//4.3.1 堆的別名--自由存儲器//4.3.2 new和delete運算符//double* pvalue = NULL;//pvalue = new double;//*pvalue = 9999.0;//pvalue = new double(999.0);//delete pvalue;//這樣將確保這塊內存以后可被另一個變量使用,如果我們不使用delete,隨后又在pvalue指針中存入一個不同的地址值,那么將無法再釋放這塊內存,或使用其包含的變量,因為我們失去了訪問該地址的途徑,這種情況被稱為內存泄漏,特別是出現在用戶程序中的時候//4.3.3 為數組動態分配內存//pstr = new char[20]; 聲明動態數組//delete []pstr; 刪除數組 使用方括號是為了指出要刪除的是一個數組,//從自由存儲器中刪除數組時,我們應該總是包括方括號,否則結果將不可預料,別請注意,我們不需要指定任何大小,只需要寫出[]即可//當我們使用delete運算符棄某些內存之后,還應該總暗針訪俯拾皆是指針重新設置為0//pstr = 0;/*long* pprime =0;
long trial = 5;
int count = 3;
int found = 0;
int max = 0;cout<<"請輸入一個最大值:";
cin>>max;if(max < 4){max = 4;
}
pprime = new long[max]; //聲明一個long的數組*pprime = 2; //第一個值為2
*(pprime+1)=3; //第二個值為3
*(pprime+2)=5; //第三個值為5
do
{trial +=2;found = 0;for(int i=0; i<count; i++){found = (trial % *(pprime+i)) == 0;if(found)break;}if(found==0){*(pprime+ count++) = trial;}
}while(count < max);for(int i=0; i<max; i++)
{if(i % 5 ==0){cout<<endl;}cout<<setw(10)<<*(pprime+i);
}
delete []pprime;
pprime = 0;
//注意:我們不能給動態分配的數組元素指定初值,如果需要設置數組元素的初值,則必須顯示使用賦值語句
*///4.3.4 多維數組的動態分配件//與一維數組相比,在自由存儲器中為多維數組分配內存需要以略微復雜的形式使用new運算符//pbeans = new double[3][4];//pBigArray = new double[5][10][10];//前面曾經看到,可以使用變量來指定new分配的一維數組的大小,對二維或多維數組來說同樣如此,//但僅限于用變量指定最左邊那一維,所有其他維都必須是常量或常量表達式,//pBigArray = new double[max][10][10];//?????????????????????????//不會吧我得試試才知道了/*const int max = 20;const int line = 30;const int line2 = 10;double(*pBigArray)[10][10] = new double[max][10][10]; //看看成不成功delete [] pBigArray;*///上面說的是正確的,書上說的是正確的
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的Visual C++ 2008入门经典 第四章数组 字符串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DevExpress之TreeList节
- 下一篇: [转]C++中sizeof(struct