最近在複習c語言,要找工作啦,發現寫下來總結下,有助於掌握和理解知識,當然裡面有很多東西是網上找到,自己整理了下而已。
1.指標陣列與陣列指標
首先要明白優先順序順序:優先順序:()>>*
先來看指標陣列,定義int *p[10],優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1時,則p指向下乙個陣列元素,可以這樣*p=a; 這裡*p表示指標陣列第乙個元素的值,a的首位址的值。
指標陣列是多個指標變數,以陣列形式存在記憶體當中,占有多個指標的儲存空間。
再來看陣列指標,定義 int (*p)[10],()優先順序高,*與p先結合成為乙個指標,即首先p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是10,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型資料的長度。
如要將二維陣列賦給一指標,應這樣賦值:
int a[3][4];
int (*p)[4]; //該語句是定義乙個陣列指標,指向含4個元素的一維陣列。
p=a; //將該二維陣列的首位址賦給p,也就是a[0]或&a[0][0]
p++; //該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]
所以陣列指標也稱指向一維陣列的指標,亦稱行指標。
常見的難點
int main()
inta[4]=;
int*ptr1=(int *)(&a+1);//指向a陣列後面的記憶體單元,&a+1表示向後移16個儲存單元
int*ptr2=(int *)((int)a+1);//表示a的儲存單元的位址增加乙個位元組
printf("%x,%x",ptr1[-1],*ptr2);//ptr1[-1]其實指向的是a陣列的最後乙個單元,*ptr1則表示a陣列的位址後移乙個位元組之後的4個連續儲存單元所儲存的值
return 0;
ptr1:將&a+1 的值強制轉換成int*型別,賦值給int* 型別的變數ptr,ptr1 肯定指到陣列a 的下乙個int 型別資料了。ptr1[-1]被解析成*(ptr1-1),即ptr1 往後退4 個byte。所以其值為0x4。
ptr2:按照上面的講解,(int)a+1 的值是元素a[0]的第二個位元組的位址。然後把這個位址強制轉換成int*型別的值賦給ptr2,也就是說*ptr2 的值應該為元素a[0]的第二個位元組開始的連續4 個byte 的內容。
2指標函式與函式指標
指標函式:
例:int*f(x,y);
它是帶指標的函式,本質是乙個函式。
首先它是乙個函式,只不過這個函式的返回值是乙個位址值,經常使用在返回陣列的某一元素位址上。函式返回值必須用同型別的指標變數來接受,也就是說,指標函式一定有函式返回值,而且,在主調函式中,函式返回值必須賦給同型別的指標變數。
例如:float *fun();
float *p;
p = fun(a);
函式指標:
函式指標是指向函式的指標變數,即本質是乙個指標變數
例:int(*f) (int x); /* 宣告乙個函式指標*/
f=func; /* 將func函式的首位址賦給指標f*/
指向函式的指標包含了函式的位址,其功能是通過它來呼叫函式。
舉個例子:
void (*p1)(); 定義乙個函式指標,同樣也是根據優先順序順序,先是乙個指標,再是乙個函式。
void love(), hate(); 定義了兩個函式
main()
3指標與引用
1引用的基本問題:一般變數的引用和指標變數的引用
一般:
例int &b=a;表示b被宣告為a的引用,對比賦值就是對a賦值注:引用使用時必須初始化,例如:int &c; 是錯誤的
指標變數的引用:
例:intb=10;
int a=1;
int *p=&a;// 宣告整型的指標變數p指向a.
int* &pa=p;// 宣告pa為指標變數p的引用。
當然還有引數引用和常量引用就不再細說了
指標和引用的區別:
no1:引用在建立的同事必須初始化,而指標在定義的時候可以不初始化,但指標在後面必須初始化。否則指標會成為野指標。
n02:引用一旦被初始化,就不能被另外乙個物件引用,而指標是可以的。
no3:引用不會指向空值,使用引用之前不用測試他的合法性,而指標需要。
no4:由於不存在空值引用,引用也不會在初始化後指向另乙個物件,因此比指標安全。
關於指標的一些知識
要說指標 位址 筆者認為必須從記憶體開始說起,也就是儲存單元的位址,他是一種編號,相當於一排的座位,位址 座位編號 但是要談起 指標 可不像平時書上說的那樣,指標 位址,這種說法已經被廣大的 語言愛好者給抨擊了,那指標相當於什麼?可能你要這麼問,形象的說指標就相當於乙個箱子,箱子裡面放了乙個椅子,椅...
10 12關於指標的一些知識
1.指標的普通用法 include using namespace std int main 2.關於指標的運算。include using namespace std const intmax 3 int main int ptr 指標中的陣列位址 ptr var for inti 0 i max...
引用和指標的一些知識
引用並非物件,相反的,它只是為乙個已經存在的物件所起的另外乙個名字。引用即別名 int val 1024 int refval val refval指向val 是val的乙個別名 定義引用時,程式把引用和它的初始值繫結 bind 在一起,而不是將初始值拷貝給引用。一旦初始化完成,引用將和它的初始值物...