主要內(nèi)容有:指針的定義,訪問,,操作,,指針地址作為返回值,指針和引用的區(qū)別,,指針和數(shù)組區(qū)別 <1>指針的定義: 一級指針定義: int* p=new int; 二級指針: int **p=NULL; int** p=new int*[10];初始化時只有最高位可先不定義 當(dāng)使用const限制時,,有以下幾種情況: const char* p,char const *p,char *const p,const char* const p,,有何區(qū)別,? 1)當(dāng)const 在*前面,相當(dāng)于const修飾的是*p,即指針內(nèi)容:如const char* p, char const *p 則限制指針指向地址的內(nèi)容不可修改 const char* p=new char('a'),則操作*p='b'會出錯,,不可修改指針內(nèi)容 2)當(dāng)const在*后面,,char *const p;時,相當(dāng)于const修飾的是p,即指針地址,,不可修改指針的地址 char* const p=new char('a'),則p=new char('b')出錯 3)兩者一起則指針的內(nèi)容和地址均不可改
<3>指針的操作: cout<<s<<endl; s[0]='B'; cout<<s<<endl;
指針運算問題都是以相應(yīng)變量的類型大小作為基本單位的,,例如int p[4]={0,0,0,0},p+1就是指p的地址基礎(chǔ)上偏移4字節(jié),。同理,,&p[0]+1也是一樣的。除非(char*)&p[0]+1才是偏移一個字節(jié),,因為地址被強制轉(zhuǎn)化為char*了,。 上面所說的地址地址++或--都是對于偏移地址offset而言的,。 *和++優(yōu)先級一樣,采用右結(jié)合規(guī)則: *p++,:即*(p++)結(jié)果相當(dāng)于*p,因為p++返回值為p (*p)++:先取p所指向的值,,將值加1 *++p:即*(++p),結(jié)果為p下一位的值,,因為++p返回值為p+1; ++*p即++(*p),結(jié)果為p的值加一 指針與sizeof()(32位系統(tǒng)):以下sizeof(p)的結(jié)果為: 〈5〉指針和引用的區(qū)別: <6>指針地址作為返回值: 當(dāng)指針指向全局存儲區(qū)時,此時指針的地址作為返回值是有效的的,,其他情況則無效,。 因為函數(shù)結(jié)束是局部變量空間會被回收,全局存儲區(qū)則不會 如:char* p='asda' 有效,,char s[]='asda' 返回則無效 <7>指針和數(shù)組區(qū)別: 1)當(dāng)數(shù)組作為函數(shù)參數(shù)時會退化為指針,,即此時數(shù)組與指針操作是等價的,如: void test(char s[],int len) 2)其他情況,,數(shù)組名可以看成一個常量指針,,指向數(shù)組首元素,此時的數(shù)組名不可以進行++,--操作,,不可被復(fù)制,,即不可修改 注意:int a[10],a指向數(shù)組首地址,&a是數(shù)組地址,,即&a+1,相當(dāng)于移動40個字節(jié),,此時指針指向數(shù)組尾部。 |
|
來自: 王子hgyufaq6hk > 《C語言編程》