如何正確使用指標陣列? 警醒

2021-07-30 14:17:49 字數 1714 閱讀 6522

如何正確使用指標陣列?

#include

void man(

int*a);

void exchange(

int*x,

int*y);

int main()

//求輸入10個數求最大最小並把最大和最後乙個數換最小和第乙個數換,其它數的位置不變並輸出要求必須用指標;

man(a);

//這裡傳遞過去的是什麼呢?

for(i=

0;i!=

10;i++)

printf(

"%-4d

",*a[i]);

printf(

"\n");

return0;

} void man(

int*a)

//求最大和最小;

exchange(min,a[

0]);

exchange(max,a[

9]); }

void exchange(

int*x,

int*y)

//交換位置;

int*a[10];

樓主其實自己都有懷疑,所以偷巧寫成那樣,這個其實應該寫成:

int* a[10];  (寫成int *a[10];也是符合語法的,但會誤導自己,以為指向的是int型資料,但編譯器不會理解錯,是你自己理解錯)

表示a是儲存10個int*指標的陣列,是10個指標,不是10個int資料,所以這些指標全部是沒有指向資料實體的,當把a[i]傳給scanf()函式,scanf()把這個a[i]裡面的指標值視為某個int型資料實體的位址,要對它進行解引用,給那個位址處的記憶體賦值,由於指標a[i]沒有初始化,所以崩潰。

對,在語法上,編譯器接受scanf("%d", a[i])這樣的編碼,但那僅僅是過了語法檢查關,並不表示執行也能正確。scanf()需要指標,你就給它指標,但指標指向對不對,編譯器是無法檢查出來的。

不要把int* i當作定義了乙個int資料,這是我反覆說過的。有人必然有名片,但有名片不必然就有人,人是資料實體,指標只是名片,名片是可以亂印的。都把指標當神器,但如果不深刻了解,只能是搬起石頭砸自己的腳。寫出int*a[10]這樣的**,必須自己很清楚那是什麼意思,能夠怎麼用,必須怎麼用,搞不清楚,就老老實實地定義int a[10],就如下面int b[10]能用一樣。定義指標之後,總得在記憶體中開闢資料實體,除了資料實體本身占用的記憶體之外,還附帶多了乙個指標變數也占用記憶體的開銷,省不了記憶體(其實按指標定址是間接定址,操作是先取指標位址值定位位址然後再取值,步驟比直接定址多了兩步,時間上也不佔優),但更容易令你出錯。指標用在該用的地方,而且能不用就盡量不用,不要被人誤導,總想用指標顯威風,沒有任何一本程式設計實用指南指導程式設計師盡量採用指標。信不信由你,未出校門的人就喜歡中這種毒,將來害死你的時候,不要後悔。

指標,是在程式的實際迫使不得不用,或者能夠使**顯得更清晰、表達更自然的時候,應該採用。如果不具備這樣的效果,就不要用,哪怕犧牲一點點速度效能,也要優先保證**的清晰性和可維護性,這才是正確性的保障基礎,**不清晰,連排錯都成問題,排錯的時間比贏得的那一點點毫秒級的時間多不知幾千萬倍,論人工按時間攤下來的成本,那麼一點速度優勢彌補得來嗎。做專案的頭兒,如果不懂衡量取捨這種綜合關係,純走技術路線,他根本沒資格坐這位置,而凡是有這種觀念的人,都注定不是做專案頭子的料,不管他吹得多牛,一說這種話,就徹底暴露,要麼是撒謊,要麼是哪個傻瓜老闆被南郭先生騙了。

陣列指標 指標陣列 二維陣列如何理解與使用

首先它是乙個指標,它指向乙個陣列,在32位系統下任何型別的指標所佔記憶體大小都為4個位元組,至於它指向的陣列佔多少位元組,具體要看陣列的大小。總之,陣列指標即為 指向陣列的大小 例如 int p 4 定義了乙個陣列指標,該指標變數儲存的是乙個陣列的首位址,它可以指向乙個含有4個整型元素的陣列。1 對...

如何正確使用記憶體

如何正確使用記憶體 對於初學者來說,記憶體是個神秘的空間。程式的絕大部分錯誤,也是在於記憶體的使用不當造成的,而且這些錯誤有些都是隱藏很深的。所以,如何掌握記憶體的使用,通曉系統對記憶體的管理手段,將是軟體成功的乙個非常關鍵的因素。首先我們要了解記憶體的分配方式。一般來說,記憶體的分配方式有三種 1...

如何正確使用列舉

列舉型別,對程式設計師來說再熟悉不過了,但是,你確定你在正確得使用它嗎?在用列舉之前,讓我們來區分一下狀態和選項這兩個概念。那麼,我們怎麼使用列舉來定義狀態和選項呢?不好的寫法 你可能經常見到的寫法 define status fail 0 define status success 1 用int變...