語言基礎知識匯總_第1頁
語言基礎知識匯總_第2頁
語言基礎知識匯總_第3頁
語言基礎知識匯總_第4頁
語言基礎知識匯總_第5頁
已閱讀5頁,還剩63頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

關于語言基礎知識匯總第1頁,課件共68頁,創(chuàng)作于2023年2月2§1C++語言的字符集與詞匯1.字符集(1)字母

ABCD…Zabcd…z(2)數(shù)字

0123456789(3)特殊符號空格!#$%&.'"()*+,-?/:;<=>@[\]^_{|}~第2頁,課件共68頁,創(chuàng)作于2023年2月32.詞匯:五類(1)關鍵字(保留字):系統(tǒng)預定義且有專門含義的單詞,不允許另作它用

.C++的關鍵字包含了C語言的幾乎所有關鍵字

.C++的關鍵字隨C++的發(fā)展而不斷增加

(2)標識符:由程序員為程序中的各種成份定義的名字

.以字母或_開頭,由字母、_、數(shù)字組成

.不能是關鍵字

.C++中的標識符區(qū)分大小寫

.見名知義的原則

.C++系統(tǒng)對標識符的長度有一定限制

(3)直接常量

(4)運算符

(5)分隔符:用來分隔不同的語法成份的單詞空格"';{}#()/**///**C++的兩種注釋:./*…*/.//注釋到行尾第3頁,課件共68頁,創(chuàng)作于2023年2月4§2基本數(shù)據(jù)類型、運算符與表達式一.數(shù)據(jù)類型每一項數(shù)據(jù)都唯一的屬于某種類型每一數(shù)據(jù)類型都有一個明確定義的值的集合每一類型的數(shù)據(jù)占用相同大小的存儲空間同一類型的數(shù)據(jù)可以進行相同類型的運算數(shù)據(jù)類型簡單類型復合類型指針類型*用戶定義類型enum基本類型整型int浮點型float字符型char空類型void布爾型bool數(shù)組[]結構體struct共用體union類class1.C++的數(shù)據(jù)類型基本類型是由系統(tǒng)定義,各種語言都具備的類型復合類型與指針類型都屬于用戶定義類型第4頁,課件共68頁,創(chuàng)作于2023年2月52.基本類型int型:整型VC中占4字節(jié)float型:浮點型4字節(jié)char型:字符型1字節(jié)void型:空類型bool型:布爾型1字節(jié)值為true或false**修飾說明符long與short、signed與unsignedlong和short修改整型具有的最大值和最小值signed和unsigned告訴編譯器如何處理整型和字符型數(shù)據(jù)的最高位float型可用double和long

double修飾,修改實型數(shù)據(jù)的表數(shù)范圍和精度第5頁,課件共68頁,創(chuàng)作于2023年2月6類型名字節(jié)數(shù)取值范圍bool1true、falsechar1-128--127[signed]char1-128--127unsignedchar10--255int4-231--231-1[signed]int4-231--231-1unsigned[int]40--232-1[signed]short[int]2-32768--32767unsignedshort[int]20--216-1[signed]long[int]4-231--231-1unsignedlong[int]40

--232-1float4-3.4E(+/-)38--3.4E(+/-)38double[float]8-1.7E(+/-)308--1.7E(+/-)308longdouble[float]10-3.4E(+/-)4932--3.4E(+/-)4932C++中的全部基本類型第6頁,課件共68頁,創(chuàng)作于2023年2月7二.運算符與表達式1.運算符算術運算符:+-

*/%++--關系運算符:>>===<<=!=邏輯運算符:&&||!位運算符:&|^~<<>>賦值運算符:=+=-=*=/=%=<<=>>=&=|=^=條件運算符:?:逗號運算符:,指針運算符:&*求字節(jié)運算符:sizeof函數(shù)調用運算符、強制類型轉換運算符:()分量運算符:.->數(shù)組下標運算符:[]作用范圍分解運算符:::動態(tài)內存分配符:new、delete插入提取運算符:<<

>>第7頁,課件共68頁,創(chuàng)作于2023年2月8運算符的優(yōu)先級與結合性運算符含義要求操作對象數(shù)目結合性()::[].->括號作用范圍分解(限定)運算符數(shù)組下標運算符成員運算符左->右++--&*!~+-()sizeofnewdelete自增自減取地址指針引用邏輯非按位取反正負號強制類型轉換求字節(jié)動態(tài)分配釋放內存1右->左*/%乘法除法求余2左->右+-加法減法2第8頁,課件共68頁,創(chuàng)作于2023年2月9運算符的優(yōu)先級與結合性(續(xù)表)運算符含義要求操作對象數(shù)目結合性<<>>左移右移運算符2左->右<<=>>=小于小于等于大于大于等于==!=等于不等于&^|按位與按位異或按位或&&邏輯與||邏輯或?:條件運算符3右->左=+=-=*=/=%=<<=>>=&=^=|=賦值運算符擴展的賦值運算符2右->左,逗號運算符2左->右第9頁,課件共68頁,創(chuàng)作于2023年2月10C++中的類型轉換轉換運算符:()兩種強制類型轉換的方法:(目標類型名)表達式:

floatx=2.5;inty;y=(int)x;目標類型名(表達式):

floatx=2.5;inty;y=int(x);C++中的顯式轉換static_cast可以不用強制類型轉換但一定會發(fā)生轉換的地方(為了更清楚、更醒目而使用)const_cast對const和volatile進行轉換reinterpret_cast轉換為完全不同的意思,必須轉換回原來的類型才能安全的使用,最為危險dynamic_cast把基類對象(指針)轉換為派生類對象(指針)時使用使用方式

轉換用關鍵字<目標類型名>(待轉換的表達式)第10頁,課件共68頁,創(chuàng)作于2023年2月11例:static_castvoidfunc(int){}void

main(){

inti=0x7fff;longl;floatf; l=i;f=i;//更好的方法是使用static_cast l=static_cast<long>(i);f=static_cast<float>(i); i=l;i=f;//以上兩條語句會出Warning,可使用如下方式消除

i=static_cast<int>(l);i=static_cast<int>(f);

charc=static_cast<char>(i);

void*vp=&f;

float*fp=(float*)vp;//C的方法,不好

fp=static_cast<float*>(vp);//更好的方法

doubled=0.0;

intx=d;//自動發(fā)生隱式類型轉換

x=(int)d;//C的方法,不好

x=static_cast<int>(d);//更好的方法

func(d);//自動發(fā)生隱式類型轉換

func(static_cast<int>(d));//更好的方法}第11頁,課件共68頁,創(chuàng)作于2023年2月12例:const_castvoid

main(){

constinti=0; //int*j=&i;//錯誤,不允許這樣賦值

int*k=(int*)&i;//被摒棄的方法

k=const_cast<int*>(&i); //long*l=const_cast<long*>(&i);

//錯誤,不允許同時進行const*->nonConst* //和nonConst*->long*兩項轉換}第12頁,課件共68頁,創(chuàng)作于2023年2月13例:reinterpret_cast#include<iostream>usingnamespace

std;constintsz=100;struct

X{inta[sz];};voidprint(X*x){

for(inti=0;i<sz;i++) cout<<x->a[i]<<""; cout<<endl<<"-----------------"<<endl;}voidmain(){

Xx;

print(&x); int*xp=reinterpret_cast<int*>(&x);

for(int*i=xp;i<xp+sz;i++) *i=10;

print(reinterpret_cast<X*>(xp));

print(&x);}第13頁,課件共68頁,創(chuàng)作于2023年2月142.表達式

由運算符連接操作數(shù)構成的式子算術表達式關系表達式邏輯表達式賦值表達式條件表達式逗號表達式第14頁,課件共68頁,創(chuàng)作于2023年2月15§3常量與變量一.C++中的常量1.直接常量(字面常量):10,10.5,'A',"string".int型.float型.char型.字符串常量

.bool型:true、false

2.符號常量:C++中有兩種符號常量#define定義的常量例:#definepi3.1415926關鍵字const定義的常量例:constintsz=100;#define定義的常量,在預處理時只是字符串的替換,對編譯器而言,不帶有任何類型信息,不便于查錯;而const定義的常量帶有類型信息,故優(yōu)于#define定義的常量C++推薦使用const定義的常量第15頁,課件共68頁,創(chuàng)作于2023年2月16const常量定義語法:

const類型名常量名=常量值;或類型名const常量名=常量值;例:constfloatpi=3.14;floatconstpi=3.14;constintmin=50;intconstmin=50;constintmax=2*min;intconstmax=2*min;const定義的常量,相當于定義了一個相應類型的變量,但其值不能發(fā)生改變例:constintmin=50;

min=40;//錯誤,不能改變min的值

所以,定義const常量的同時必須初始化,且一旦初始化后,就不會(因不能故不會)再發(fā)生變化。因此在作用范圍內若某變量的值不會發(fā)生改變,則定義該變量時應用const進行限定,以免無意中改變該變量的值const常量是編譯時的常量例:constintsz=100;intarr[sz];第16頁,課件共68頁,創(chuàng)作于2023年2月17const與指針1.指向常量的指針:限定指針所指的對象、變量定義形式:

const類型*指針變量[=地址表達式];或類型const*指針變量[=地址表達式];例:intvar=35;constintmax=100;int*p;

constint*p1_const;constint*p2_const;p1_const=&var;p2_const=&max;var=40;

*p1_const=100;*p2_const=200;max=200;p=&max;p1_const和p2_const,var不是常量*p1_const和*p2_const、max是常量第17頁,課件共68頁,創(chuàng)作于2023年2月18指向常量的指針const

int*p1_constconst

int*p2_constconst

intmaxintvarp1_const不是常量,p1_const指向的變量的值不能通過*p1_const改變,但p1_const指向的變量即var本身不是常量,是可以改變的,故*p1_const=100;var=40;p2_const不是常量,p2_const指向的變量的值不能通過*p2_const改變,且p2_const指向的變量即max本身是常量,其值不能改變,故*p2_const=200;max=200;第18頁,課件共68頁,創(chuàng)作于2023年2月192.指針常量:指針變量本身的值初始化后不能再改變

定義方式:

類型*const指針變量=地址表達式;例:intvar1=100,var2=200;constintmax=1000;

int*constcst_p1=&var1;

int*constcst_p2=&max;

*cst_p1=var2;

cst_p1=&var2;

只說明了指針變量如cst_p1本身是常量,但并沒有說不能改變*cst_p1的值必須要賦初值第19頁,課件共68頁,創(chuàng)作于2023年2月203.指向常量的指針常量

指針變量本身和所指對象的值都為常量,不能改變

定義方式:

const類型*const指針變量=地址表達式;或類型const*const指針變量=地址表達式;

例:intvar1=128,var2=256;constintmax=1000;

constint*constdoubleCst_p1=&var1;constint*constdoubleCst_p2=&max;

doubleCst_p1=&var2;*doubleCst_p1=500;var1=max-var2;第20頁,課件共68頁,創(chuàng)作于2023年2月21二.C++中的變量變量必須先定義(聲明)再使用變量的定義

存儲類型數(shù)據(jù)類型名變量名列表;C++中幾乎隨處可以定義變量例:

for(inti=0;i<100;i++)…if(i<100){intx=0;x+=100;

inty=10;}變量的分類:根據(jù)定義變量的位置,分為兩類:全局變量(外部變量)局部變量(內部變量)第21頁,課件共68頁,創(chuàng)作于2023年2月22變量的存儲類型存儲方式:動態(tài)存儲方式和靜態(tài)存儲方式靜態(tài)存儲方式:程序運行過程中給此類變量分配固定的存儲空間動態(tài)存儲方式:程序運行過程中根據(jù)需要,給此類變量動態(tài)分配存儲空間程序代碼區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)程序的存儲組織第22頁,課件共68頁,創(chuàng)作于2023年2月23變量的存儲類型auto、register、static、extern和默認五種auto:自動類型普通的局部變量都屬于此類,分配在動態(tài)存儲區(qū)中register:寄存器類型static:靜態(tài)變量靜態(tài)局部變量:在靜態(tài)區(qū)中,只初始化一次,多次調用函數(shù)時能保留前一次函數(shù)調用結束時的值,延長了該變量的生存期靜態(tài)全局變量:在靜態(tài)區(qū)中,限制了該變量的作用域extern:外部變量定義全局變量聲明外部變量:擴展了全局變量的作用域第23頁,課件共68頁,創(chuàng)作于2023年2月24例:static#include<iostream>usingnamespacestd;intfactor(intn){

staticintresult=1; result*=n; returnresult;}voidmain(){ for(inti=1;i<=8;i++) cout<<factor(i)<<""; cout<<endl;}第24頁,課件共68頁,創(chuàng)作于2023年2月25例:extern//main.cpp#include<iostream>usingnamespacestd;externintnTestVar;voidmain(){ nTestVar=100; cout<<nTestVar<<endl;}//test.cppintnTestVar;同一個工程的兩個文件第25頁,課件共68頁,創(chuàng)作于2023年2月26變量的生存期與作用域生存期:變量a的生存期指從a被說明且分配了內存開始,直到該變量占用的內存被釋放為止,是時間概念作用域:變量a的作用域指標識符a可以代表該變量的范圍,是空間概念全局變量:生存期從程序開始運行到程序運行結束,而作用域則從定義該變量的地方開始,直到本文件末尾普通局部變量:生存期從程序執(zhí)行到包含該變量定義的復合語句時開始到該復合語句執(zhí)行結束,而作用域則從該變量的定義處開始到包含該變量的程序塊末尾靜態(tài)局部變量:生存期從為該變量分配了內存起直到程序結束,但作用域則與局部變量的作用域相同例:生存期與作用域第26頁,課件共68頁,創(chuàng)作于2023年2月27變量的初始化

定義變量的同時給變量賦以初值

.兩種方法

.例:inta=3;.例:inta(3);第27頁,課件共68頁,創(chuàng)作于2023年2月28§4C++中的輸入/輸出一.輸入/輸出方式

1.C語言的方式:使用scanf()、printf()等輸入/輸出庫函數(shù)

2.使用流對象的方式把數(shù)據(jù)從一個對象向另一個對象的流動抽象成流流好比管道,從一端放入什么從另一端就能取出什么C++中的流對象一般與一個文件相關聯(lián),用流對象進行輸出操作相當于把要輸出的數(shù)據(jù)寫入文件中,進行輸入操作相當于從文件中讀出數(shù)據(jù)存于變量或對象中從流中獲取數(shù)據(jù)的操作稱為提取操作:流對象>>變量向流中添加數(shù)據(jù)的操作稱為插入操作:流對象<<數(shù)據(jù)

<<:插入運算符

>>:提取運算符cin和cout是C++預定義的流對象

cout:用于進行輸出操作,與顯示器相關聯(lián)

cin:用于進行輸入操作,與鍵盤相關聯(lián)第28頁,課件共68頁,創(chuàng)作于2023年2月29<<與>>

用法:cout<<表達式1<<表達式2<<…<<表達式n;

cin>>變量1>>變量2>>…>>變量n;<<可以串聯(lián)多個<<輸出多個數(shù)據(jù)項,>>同樣也可以串聯(lián)多個>>給多個變量輸入數(shù)據(jù)>>輸入時多個數(shù)據(jù)項之間用空格、Tab或回車分隔<<和>>具有智能,能夠自動判斷其后的數(shù)據(jù)項的類型,并采用相應的類型進行輸出或輸入使用流對象時,必須#include相應的頭文件(如iostream)并使用語句“usingnamespace

std;”打開名稱空間std

cin與cout在iostream中的std名稱空間中定義第29頁,課件共68頁,創(chuàng)作于2023年2月30二.簡單的輸入/輸出格式控制:使用操縱符(manipulator)I/O流類庫中提供了若干個操縱符,可以直接嵌入到輸入/輸出語句中實現(xiàn)I/O格式控制操縱符功能endl輸出一個換行符,并刷新流dec用十進制輸入或輸出數(shù)值oct用八進制輸入或輸出數(shù)值hex用十六進制輸入或輸出數(shù)值ends輸出一個空格符,并刷新流setw(intn)設置其后一個數(shù)據(jù)項占據(jù)的寬度setfill(charc)設置數(shù)據(jù)項寬度不足時的填充字符setprecision(intn)設置浮點數(shù)輸出小數(shù)位數(shù)常用的I/O操縱符第30頁,課件共68頁,創(chuàng)作于2023年2月31說明:不帶參數(shù)的I/O操縱符定義在iostream中使用帶參數(shù)的I/O操縱符,需包含iomanipsetw()只對其后緊跟著的一個真正的數(shù)據(jù)項起作用例:cout<<'A'<<ends<<'B'<<endl; cout<<hex<<255<<ends<<32<<endl; cout<<dec<<setw(5)<<setfill('0')<<32<<endl; cout<<setw(5)<<setprecision(4)<<7.5612<<endl;屏幕輸出第31頁,課件共68頁,創(chuàng)作于2023年2月32§5基本控制結構順序、選擇(分支)和循環(huán)結構對應的控制語句控制語句無條件控制語句條件控制語句分支語句循環(huán)語句if語句switch語句switch語句for語句while語句do-while語句break語句continue語句return語句goto語句第32頁,課件共68頁,創(chuàng)作于2023年2月33§6數(shù)組、結構體、共用體和枚舉類型一.數(shù)組:需要處理相同類型的一批相關數(shù)據(jù)時使用數(shù)組分為一維數(shù)組與多維數(shù)組定義:一維數(shù)組:類型數(shù)組變量名[數(shù)組長度];二維數(shù)組:類型數(shù)組變量名[第一維長度][第二維長度];

例:intnArr[10];intnArr2d[10][5];說明:數(shù)組長度必須是常量表達式:編譯時求值C意義上的字符串采用字符數(shù)組作為其存儲形式,在最后添加一個ASCII碼為0的字符作為字符串的結束標志第33頁,課件共68頁,創(chuàng)作于2023年2月34string類:字符串類string類封裝了字符串的基本特性和對字符串的典型操作,其對象可用于保存幾乎任意長的字符串,對處理輸入文件中一行上字符數(shù)不定的情況特別有用string類是STL中的類,使用時需要包含頭文件string并打開名稱空間stdstring類的操作:成員函數(shù)求串長:size()、length()例:#include<iostream>#include<string>usingnamespacestd;voidPrintAttribute(conststring&str){ cout<<"size:"<<str.size()<<endl; cout<<"length:"<<str.length()<<endl;}第34頁,課件共68頁,創(chuàng)作于2023年2月35intmain(){ strings1,s2; PrintAttribute(s1);s1="Mystringobject";PrintAttribute(s1); s2="AnotherStringObject";PrintAttribute(s2); return0;}第35頁,課件共68頁,創(chuàng)作于2023年2月36賦值:assign()=s1.assign(s2);s1=s2;連接:append+=+

s1.append(s2);s1+=s2;s1=s1+s2;下標:[]

s1[0]#include<iostream>#include<string>usingnamespacestd;intmain(){strings1="cat",s2,s3;

s2=s1;s3.assign("jump");cout<<s2<<s3<<endl;

s1+=s3;cout<<s1<<endl;

s1.append("andyell");cout<<s1<<endl;

s1[0]='h';cout<<s1<<endl;return0;}第36頁,課件共68頁,創(chuàng)作于2023年2月37比較stringpare(s2);比較字符串s1與s2,當s1等于s2時,返回0;當s1大于s2時返回正值,否則返回負值字符串的部分比較

pare(beg1,len1,s2,beg2,len2);beg1和len1指示s1參與比較的開始字符的下標與長度,beg2和len2指示s2參與比較的開始字符的下標與長度運算符:!=<><=>=第37頁,課件共68頁,創(chuàng)作于2023年2月38例:string的比較:字符串的排序#include<iostream>#include<string>usingnamespacestd;intmain(){stringnames[]={"LiHua","HeXiaoMing","ZhangLi","SunFei","ChenBao"};strings;inti,j,k,nmb;nmb=sizeof(names)/sizeof(names[0]);for(i=0;i<nmb-1;i++){k=i; for(j=i+1;j<nmb;j++)if(names[k]>names[j])k=j; if(k!=i){ s=names[k];names[k]=names[i];names[i]=s; }}for(i=0;i<nmb;i++) cout<<"name["<<i<<"]="<<names[i]<<endl; return0;}第38頁,課件共68頁,創(chuàng)作于2023年2月39子串:substr()

s.substr(beg,len);beg指定子串的開始下標,len指定讀取的字符數(shù)strings="C++programdesign";

cout<<s.substr(4,7)<<endl;查找:find()

s.find(substring);s.find(substring,beginning);替換:replace()s.replace(beg,num,str);第39頁,課件共68頁,創(chuàng)作于2023年2月40例:把字母表中的逗號“,”全部替換為分號“;”#include<iostream>#include<string>usingnamespacestd;intmain(){stringalphabet="A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";

intx=alphabet.find(","); while(x>=0) {

alphabet.replace(x,1,";"); x=alphabet.find(",",x+1); } cout<<alphabet<<endl; return0;}第40頁,課件共68頁,創(chuàng)作于2023年2月41插入:insert()s1.insert(n,s2);

例:strings1="catjump";strings2="dog";s1.insert(4,s2);s1.insert(4,"and");cout<<s1<<endl;第41頁,課件共68頁,創(chuàng)作于2023年2月42轉換成C語言式的char*型字符串:data()c_str()copy()char*ptr=s.data();//char*ptr=s.c_str();

s.copy(buffer,n,begin);#include<iostream>#include<string>usingnamespacestd;intmain(){ strings="StringObject"; constchar*ptr1;

ptr1=s.data(); intlen=s.length(); char*ptr2=newchar[len+1];

s.copy(ptr2,len,0);ptr2[len]='\0'; cout<<s<<endl;cout<<ptr1<<endl; cout<<ptr2<<endl; delete[]ptr2; return0;}第42頁,課件共68頁,創(chuàng)作于2023年2月43從文件中輸入一行字符:getline()getline(in,str,ch);

其中:in為輸入流對象

str為string類對象

ch為結束輸入的字符,默認為'\n'

例:strings;getline(cin,s,'\n');

從鍵盤輸入一行字符(以回車結束),存入s中第43頁,課件共68頁,創(chuàng)作于2023年2月44例:從文件中輸入一行數(shù)據(jù)#include<iostream>#include<fstream>#include<string>usingnamespacestd;intmain(){stringline;ifstreaminput("input.txt",ios::in); while(1){

getline(input,line); if(input.eof())break;

//一行數(shù)據(jù)已存入line中,可對其處理,此處只將其輸出

cout<<line<<endl; } input.close(); return0;}第44頁,課件共68頁,創(chuàng)作于2023年2月45二.結構體:struct三.共用體:unionstruct

in_addr{

union{

struct

{unsignedchar

s_b1,s_b2,s_b3,s_b4;}S_un_b;

struct

{unsigned

short

s_w1,s_w2;}S_un_w;

unsignedlong

S_addr;

}S_un;};四.枚舉類型:enum——與C中幾乎一樣**:自定義的數(shù)據(jù)類型可以象C++的基本數(shù)據(jù)類型一樣使用例:in_addrIP_Address;第45頁,課件共68頁,創(chuàng)作于2023年2月46§7指針、動態(tài)內存分配與引用.程序訪問內存中數(shù)據(jù)的兩種方式

.直接訪問.間接訪問

.指針就是地址,存放地址的變量就是指針變量

.指針變量的定義:

數(shù)據(jù)類型名*指針變量名;或數(shù)據(jù)類型名*指針變量名=初始地址值;200X200X&Xpx例:float*ptr;floatx=200.0;float*px=&x;float*pn=NULL;float*pr;指針變量的三種狀態(tài)

.指向某一變量

.被賦予空值NULL,未指向任何變量

.未賦值,處于“懸空”(隨機)狀態(tài)一.指針第46頁,課件共68頁,創(chuàng)作于2023年2月47.與地址有關的運算符:&和*.取地址運算&:得到一個變量的地址

.一元運算符

.其后只能是一個變量名,不能是常量或表達式

.指針運算符*:取指針指向的變量的值

.一元運算符

.其后為一指針例:*px=300.0;x=300.0;

*與&互為逆運算第47頁,課件共68頁,創(chuàng)作于2023年2月48.指針的運算.算術運算指針可以和整數(shù)進行+、-運算,指針變量本身也可以進行++、--運算指針的算術運算一般和數(shù)組的使用相聯(lián)系

.關系運算:在指向相同類型數(shù)據(jù)的指針之間進行比較

.指針可以進行相等和不等的比較,指向同一變量(地址)時相等,否則不相等

.任一指針可以和指針常量NULL進行相等和不等的比較

.指針指向數(shù)組元素時,指針之間可以進行大小比較第48頁,課件共68頁,創(chuàng)作于2023年2月49.指針變量的使用.指向一個變量:間接訪問該變量

.指針變量與數(shù)組關聯(lián)使用:

.指向數(shù)組元素例:intarr[10];int*ptr;ptr=&arr[0];//ptr=arr;數(shù)組名是數(shù)組首元素的地址

.指向數(shù)組定義方式:類型名(*指針變量名)[數(shù)組長度];例:inta[2][4];int(*pa)[4];//定義pa為指向一維整型數(shù)組的指

//針,該一維數(shù)組有4個元素

pa=a;//pa=&a[0];pa++;//pa指向a[1],則pa==&a[1]區(qū)別二者的算術運算

使用時必須確保指向一個確定的有意義的空間第49頁,課件共68頁,創(chuàng)作于2023年2月50.指針數(shù)組:數(shù)組中的每個元素都相當于一個指針變量

定義形式:類型名*數(shù)組名[數(shù)組長度];例:inta,b,c;int*parr[3];parr[0]=&a;parr[1]=&b;parr[2]=&c;.C字符串指針:可以把字符串當作一個整體進行操作第50頁,課件共68頁,創(chuàng)作于2023年2月51.指針變量與函數(shù)關聯(lián)使用.指針變量作函數(shù)參數(shù):可改變實參指針所指變量的值

voidswap(int*px,int*py){intt;t=*px;*px=*py;*py=t;}

則inta=3,b=5;int*pa=&a,*pb=&b;swap(pa,pb);//swap(&a,&b);

調用后a和b的值各是多少?voidswap(intx,inty){intt;t=x;x=y;y=t;}則inta=3,b=5;swap(a,b);調用后a與b的值各為多少?35ab35形參變量x形參變量y35ab&a&bpapb&a形參指針px&b形參指針py第51頁,課件共68頁,創(chuàng)作于2023年2月52.函數(shù)返回指針

例:char*menu[]={"error","File","Edit","Search","Help"};char*menuItem(intm){return(m<1||m>4)?menu[0]:menu[m];}**注意:返回的指針必須是有意義的,不能是一個指向函數(shù)內的局部變量或參數(shù)變量的指針或處于“懸空”狀態(tài)的指針.函數(shù)指針

.函數(shù)名代表函數(shù)的入口地址,也稱做函數(shù)的指針

.可定義一指針變量,將函數(shù)的入口地址存入該指針變量中,通過該指針變量調用函數(shù)

.一般做函數(shù)的參數(shù)第52頁,課件共68頁,創(chuàng)作于2023年2月53二.動態(tài)分配內存.兩個運算符:new與delete.new用來動態(tài)生成一個指定類型的無名變量,并返回該變量的地址,只能通過該地址(指針)訪問動態(tài)生成的變量

.動態(tài)生成變量:int*pi;pi=newint;*pi=100;.生成變量并初始化:int*pi=newint(5);.動態(tài)生成一個數(shù)組:intn;…//通過某種運算得到n的值

int*pi=newint[n];//此時數(shù)組長度可以是變量

.delete釋放new動態(tài)生成的變量

.釋放動態(tài)生成的變量:deletepi;.釋放動態(tài)生成的數(shù)組:delete[]pi;

例:動態(tài)內存分配

注意:.new動態(tài)生成的變量不會自己撤消,所以該變量不用時,必須及時用delete將其釋放

.new與delete比C中的函數(shù)malloc和free完善,所以C++中不建議使用malloc和free動態(tài)申請與釋放內存第53頁,課件共68頁,創(chuàng)作于2023年2月54三.引用.引用即變量的別名,對引用的操作就是對目標變量的操作

.聲明引用的一般形式:

類型名&引用名=目標變量名;

例:intnSomeVar;

int&ref=nSomeVar;.引用不是變量,不占存儲空間,故只能聲明,沒有定義

.由于引用不是變量,故不能聲明引用的引用和指向引用的指針

.引用不做函數(shù)形參時,聲明引用的同時必須對其初始化

.引用一旦初始化,就維系在其目標變量上,再也不分開,對該引用的任何操作,都是對引用維系的目標變量的操作,因此對引用的賦值就是對目標變量的賦值,而不是重新引用例:intnSomeVar=0;

intnOther=10;

int&ref=nSomeVar;

ref=nOther;//等價于nSomeVar=nOther,而不

//是讓ref成為nOther的引用第54頁,課件共68頁,創(chuàng)作于2023年2月55

引用的作用.給變量一個別名,通過別名實現(xiàn)對目標變量的操作

.做函數(shù)形參:此時形參是實參的引用例:voidswap(int&x,int&y){intt;t=x;x=y;y=t;}

則inta=3,b=5;swap(a,b);調用后a和b的值分別是多少?.引用做函數(shù)參數(shù)的特點

.引用做函數(shù)形參,實參一般使用變量而不使用常量或表達式

.可改變實參的值,若不需改變實參的值時可在形參引用前加上關鍵字const,則由編譯器保證不會無意中修改實參值

.可以使函數(shù)帶回多個值

.可以減少函數(shù)調用過程中的開銷

.比指針簡潔方便,易使用,好理解35axby第55頁,課件共68頁,創(chuàng)作于2023年2月56§8函數(shù)與函數(shù)重載函數(shù)的定義與聲明定義:屬性說明返回值類型函數(shù)名(形參列表){函數(shù)體}

其中的屬性說明可以是以下幾個關鍵字之一:

.inline.static.virtual.friend.extern:C++中函數(shù)的缺省屬性就是extern函數(shù)的聲明:使用函數(shù)原型進行聲明屬性說明返回值類型函數(shù)名(形參列表);**注意:

程序中對函數(shù)的調用出現(xiàn)在函數(shù)的定義之前時,調用之前必須進行聲明函數(shù)進行聲明時形參只出現(xiàn)類型即可,可以不使用形參名函數(shù)的聲明與定義中返回值的類型必須一致,參數(shù)的類型、數(shù)目必須相符一.函數(shù)第56頁,課件共68頁,創(chuàng)作于2023年2月57

函數(shù)的使用:對函數(shù)進行調用

形式:函數(shù)名(實參列表);

例:swap(a,b);.函數(shù)調用過程中的參數(shù)傳遞

.值傳遞

.指針傳遞:仍為值傳遞,傳遞的是地址值

.引用傳遞:形參是實參的別名,完全代表了實參第57頁,課件共68頁,創(chuàng)作于2023年2月58

函數(shù)的屬性.extern(外部)函數(shù):C++中函數(shù)缺省的屬性就是外部的例:externintfunc(){…}

則函數(shù)func()的作用范圍不僅僅局限于定義它的文件中,在其它文件中可以通過使用:externintfunc()對其進行聲明,從而在第二個文件中可以調用在第一個文件中定義的func()函數(shù)

.因C++中函數(shù)的缺省屬性就是extern的,所以定義和聲明函數(shù)時通常省略關鍵字extern.static(靜態(tài))函數(shù)

例:staticintfunc(){…}

static關鍵字限制函數(shù)func()的作用范圍僅在定義它的文件中,其它文件中不可能通過聲明的方式對該函數(shù)進行調用,即使進行了聲明也無濟于事第58頁,課件共68頁,創(chuàng)作于2023年2月59.inline(內聯(lián))函數(shù).定義或聲明函數(shù)時,在返回值類型前使用關鍵字inline進行修飾的函數(shù)例:inlineintadd(intx,inty){returnx+y;}.內聯(lián)函數(shù)不被編譯為單獨一段可執(zhí)行代碼,而是把函數(shù)的可執(zhí)行代碼直接插入到對該函數(shù)的每一次調用處,所以沒有函數(shù)調用過程中的開銷,可以提高程序的效率

.與帶參的宏相似,但因為函數(shù)的參數(shù)帶有類型信息,所以比宏安全例:inlineintmax(intx,inty){returnx>y?x:y;}voidmain(){inta,b;cin>>a>>b;cout<<max(a,b)<<endl;}第59頁,課件共68頁,創(chuàng)作于2023年2月60例:內聯(lián)函數(shù)**注意

.若inline不在函數(shù)名第一次出現(xiàn)時指定,則編譯器把該函數(shù)做為普通函數(shù)對待

.內聯(lián)函數(shù)的函數(shù)體應盡可能簡潔,否則會增加程序的體積

.內聯(lián)函數(shù)中不能包含復雜的流程控制語句,否則inline關鍵字將不會起作用,該函數(shù)將成為普通函數(shù)

.inline函數(shù)不能遞歸,也不能包含靜態(tài)變量inlineintisnumber(char);voidmain(){charc;intn;n=0;while((c=getchar())!='\n'){if(isnumber(c))n++;}cout<

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論