C語言 指標(一)失效指標和陣列名的退化

2021-09-17 01:13:18 字數 1100 閱讀 9740

指標的定義在此就不進行講解,可自行翻閱書籍
今天講解兩個概念:失效指標,陣列名的退化

失效指標,在有些書上也稱為失能指標。

失效指標指向乙個已刪除的物件記憶體區域的指標。(可以通俗理解為這個指標你不知道他指向什麼)。

下面我們用兩個簡單的例子來說明一下:

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...