指標的定義在此就不進行講解,可自行翻閱書籍
今天講解兩個概念:失效指標,陣列名的退化
失效指標,在有些書上也稱為失能指標。
失效指標指向乙個已刪除的物件記憶體區域的指標。(可以通俗理解為這個指標你不知道他指向什麼)。
下面我們用兩個簡單的例子來說明一下:
int main()
printf("%d\n", *p);
return 0;
}
在上述**中我們把條件判斷語句中的語句稱為塊內作用域,也就是說x只在花括號內有效,程式成從if語句中退出的時候x被釋放,這時候p就成為失效或者失能指標。但是你執行程式之後發現程式依舊可以執行,且p的值列印出來有可能是100,原因是因為p所指向的區域被是釋放或者不受控制之後,這個記憶體上原有的資料沒有被覆蓋。
第二個例子:
int* fun()
void add()
int main()
這段程式的列印結果是什麼呢?100?
結果是0,為什麼是0呢?在你調動fun函式結束的時候,fun函式的棧幀被釋放,第二次呼叫函式add的時候,系統給add分配了乙個棧幀,add內定義x=0,資料剛好覆蓋了原有的a=100;
在c語言中,陣列名一般表示陣列首元素的位址,但是陣列名有三個例外:在sizeof函式中在引用陣列時;指向陣列的指標;引用陣列。
下面我們要說的是陣列名作為函式形參,編譯器將其作為指標來對待
我們用乙個例子來說明:編寫乙個輸出陣列的元素的函式
void fun(int *br,int n)
cout << n << endl;
}int main()
; int n = sizeof(ar) / sizeof(ar[0]);
fun(ar,n);
return 0;
}
在函式中,實參陣列名代表該陣列首元素的位址,所以形參應該是乙個指標變數。實際上在c的編譯形參陣列名都是作為指標變數的來處理的。
注意:在給函式傳入乙個指標變數時,一定要對指標進行判空,防止傳入乙個空指標
指標和陣列名
想要清楚的知道指標和陣列的本質區別還有處理方式,感覺繞不開看編譯器是如何處理的了,有時間可以上知乎搜搜有什麼編譯類的書籍,或者找個懂編譯的大神,在網上看到有一篇從編譯器角度剖析陣列名的,有所幫助,雖然沒有說到足夠深入讓我理解指標和陣列真正的本質是什麼 本文只是稍微說明一下自己的猜測和理解,可能存在有...
指標和陣列名
在學習c語言指標時候,老師告訴我們,陣列名就是指標,指向陣列首元素的位址。有如下 int main int argc,const char argv printf arr p n arr printf arr 1 p n arr 1 printf lu n sizeof arr printf n p...
陣列名和陣列名取位址 指標陣列和陣列指標的區別
一,首先我們先分析下陣列名和陣列名取位址的區別。我們都知道陣列名是陣列的首位址,然而對陣列名取位址又是什麼那?看下面一段程式你就會懂的。分析 由執行結果可知,陣列名a和 a的記憶體位址相同,我們已經知道a a 0 所以有a 1指向陣列中下乙個元素 即為在首位址2751180基礎上加int的位元組數4...