初談指標(2)

2021-08-21 22:03:00 字數 3421 閱讀 6160

首先我們需要理清指標與陣列的關係:陣列不等於指標,但在某些情況下二者等價

定義乙個一維陣列int a[i] = ;,當我們使用a[i]的時候,實際上編譯器做了轉換處理,變成了*(a+i)

一維陣列是方便理解的,那麼二維陣列呢?

a[i][j]*(*(a+i)+j)具有等價效果,對後者分析如下:

a表示二維陣列中第一行的位址,a+i則表示第i+1行的位址

*(a+i)表示第i+1行的列位址(這個列為第一列),*(a+i)+j則表示第i+1行、第j+1列的位址

*(*(a+i)+j)表示取出這個位址上的資料

有了這個鋪墊,我們就可以愉快的開始下面的旅程了。

前面說到在指標函式中,return的時候注意不要是區域性變數的位址,這句話本身是有瑕疵的。但如果就這樣做了,保準兒程式不會出錯。但是等一等,我們需要這般畏首畏尾嗎?

與「猥(畏)瑣(縮)」說不!

一般說來,存放在棧中的變數不可以被return位址。這是由於棧中的資料由系統產生,也由系統**,很難說我們在return棧中的某個資料的位址時,系統是不是早一步把它乾掉了。

但這幾個資料是可以的:全域性變數,靜態變數,常量資料,堆中的資料。乙個執行的程式裡,這些資料並不存放在棧中,具體在**涉及到記憶體分配的問題,這裡不做延伸了。

函式指標的根本是指標,它能夠指向乙個函式。

定義:int (*p)(int, int);

表示p是乙個能夠指向函式的指標,並且它指向的函式是int型別,且這個函式有兩個引數,這個兩個引數都是int型別。

#include

intadd_xy

(int x,

int y)

intmain

(int argc,

char

**agrv)

// 輸出

>>

3

舉一反三:char *(*p)(int, char *)表示p是乙個指向函式的指標,這個函式有兩個引數:乙個int型別,乙個char*型別(char*的指標),並且這個函式返回char *的指標

一定要區分:char *p(int, char *),當沒有小括號把指標運算子和指標變數包起來的時候,表示指標函式的宣告,函式的名字為p

指標陣列的根本是陣列,即:乙個陣列裡的成員都是指標

定義:int *p;

按照優先順序順序,這裡p是乙個整體,所以可以看作:int *—>p

示例:

#include

intmain

(int argc,

char

**agrv)

;// 定義乙個指標陣列,並且初始化

int i =0;

for(i=

0;i<

3;i++

)return0;

}// 輸出

>>

1>>

2>>

3

陣列指標的根本是指標,即:乙個指向陣列的指標

定義:int (*p);

按照優先順序順序,*p是乙個整體,所以可以看作int *p—>

示例:

#include

intmain

(int argc,

char

**argv),,

};int(

*p)[3]

= a;

// 定義乙個陣列指標,並且初始化

int i =

0, j =0;

int row =

3, col =3;

for(i=

0; ireturn0;

}// 輸出

>>12

3456

789

定義:int *const p;

指標(*)常量(const),也就是說指標運算子在const的前面;const修飾的是p,所以p不能被賦值

#include

intmain

(int argc,

char

**argv)

// 輸出

>>

1>>

2

定義:int const *p;

常量(const)指標(*),也就是說,const在指標運算子的前面;並且可以看做const 修飾的是*p,所以*p不能被賦值

示例:

#include

intmain

(int argc,

char

**argv)

// 輸出

>>

1>>

2

字元指標資料,也就是乙個陣列,裡邊的成員都是char *的指標,即:char *str = ;

二維字元陣列,乙個二維陣列,裡邊成員都是char型別的字元,即:char str[n] = ;

#include

intmain

(int argc,

char

**agrv)

;int i =0;

for(i=

0; i<

3; i++

)printf

("\n");

char hobbies[

10]=;

for(i =

0; i<

3; i++

)printf

("\n");

return0;

}// 輸出

>>tom alice bob

>>swimming sleeping reading

在使用上,二者是沒差的,但從記憶體上分析就存在區別。

字元指標陣列中的成員都是乙個char *的指標,也就是說,它們都是位址,真正的字串存放在常量區;二維字元陣列裡邊存放的都是乙個個char型別的字元。建議使用前者,因為字元指標陣列儲存字串要比二維字元陣列開銷小。

我記得有乙個送命遊戲叫做:南韓女星連連看。其實對我重度臉盲患者,豈止南韓女星,即便是現在的許多大陸女星,我也著實難分辨(其實現在的新興男星我也基本分不清了)。好在能不能區分出明星還是其次,重要的是區分以下的表示式。如果能夠輕易識別,指標也算入門了。

初談指標常量和常量指標

在學習c 中,對於指標方面的知識學習方面還是有一定難度的,相關概念也很晦澀難以理解,本人整理了相關的知識點已經本人的理解,希望可以得到大家的更正和幫助到你們的學習。很多老師為了同學們能很快的理解和應用指標,往往會告訴大家 指標即位址!其實我可以告訴你這是乙個不嚴謹的說法,正確來說 指標是乙個變數!變...

初談CSRF攻擊

我和大家分享一下我在開發時候遇到的一些問題,以及我的解決方案。跨站請求偽造 cross siterequest forger 簡稱csrf,有時候縮寫xsrf表示,攻擊要比簡單的跨站指令碼 xss 攻擊更危險。我主要講解它的危害以及如何防禦,並不會說明如何去實現。1.威脅概述 假設乙個 允許使用者登...

初談Java集合

1.集合是什麼?簡單來說,集合 陣列 對陣列的演算法,一般在實際操作過程中,批量管理陣列就是使用集合或者陣列。此外要注意的是 集合中儲存的是引用型別,並且集合只儲存每個元素物件的引用,而並非將元素物件本身存入集合中!因此導致,如果在集合之外修改集合中的元素,那麼集合也會受影響。2.集合框架 總的來說...