函式名與陣列名的誤解

2021-10-12 20:57:19 字數 1680 閱讀 8250

一、函式名的誤解

很多人把函式名理解為是函式的位址名,其實函式名是乙個函式實體的代表,並非是乙個位址的代表。

函式名可以作為函式的位址,但是,絕大多數人都忽略了乙個條件,從函式到指標的隱式轉換是函式名在表示式中的行為,就是說,這個轉換僅在表示式中才會發生,這僅是函式名眾多性質中的乙個,而非本質,函式名的本質就是函式實體的代表。

下面看一道牛客題

已知fun(int)是類test的公有成員函式,p是指向成員函式fun()的指標,採用( )是正確的。

a、p=fun

b、p=test::fun()

c、p=fun()

d、p=&test::fun

這道題的答案是d

解析:c++規定,非靜態成員函式的左值不可獲得,因此非靜態成員函式不存在隱式左值轉換,即不存在像常規函式那樣的從函式到指標的隱式轉換,所以必須在非靜態成員函式前使用&操作符才能獲得位址。

陣列名的誤解

1、陣列作為形參退化為指標

void arraytest(char str) 

輸出:4

(1)陣列名 作為函式形參時,在函式體內,其失去了本身的內涵,僅僅只是乙個指標;

2)很遺憾,在失去其內涵的同時,它還失去了其常量特性,可以作自增、自減等操作,可以被修改。

2、陣列名可作為指標常量

陣列名的外延在於其可以轉換為指向其指代實體的指標,而且是乙個指標常量;

陣列名可以轉換為指向其指代實體的指標,但是它只能被看作乙個指標常量,不能被修改。

3、 取陣列名的位址

a 的值是陣列首元素的位址,&a是取陣列名的位址

「取乙個陣列名的位址所產生的是乙個指向陣列的指標,而不是乙個指向某個指標常量值的指標」(出自《c和指標》第142頁)。

int a[10];

printf("a + 1 = %d\n", a + 1);

printf("&a + 1 = %d\n", &a + 1);

a指向首元素,右移一位,位址增加了4位元組,也就是乙個int的長度;

&a指向陣列,右移一位,位址增加了40位元組,相當於指向了下乙個陣列(實際上並不存在),或者說指向了陣列a最後乙個元素的下乙個元素,這在c++裡稱為尾後指標。

4、陣列名不是常量

在表示式中,陣列名的確可以轉換為乙個不變的符號位址,但在c中,不變的實體不一定是常量!而且,c/c++有常量與常量表示式之分,常量與常量表示式是兩種不同的實體,但常量表示式可以作為常量使用。c/c++中的常量雖然有所不同,但都不包括陣列或陣列名,而且陣列名也不一定是常量表示式。

c/c++中的陣列名,都不是常量。c中的陣列名,是否常量表示式要視其儲存連續性而定,全域性陣列、靜態陣列名都是常量表示式,而自動陣列名不是。在c++中,由於不再規定常量表示式必須是編譯期的,因此c++的陣列名都是常量表示式。

指標是位址的誤解

指標不是位址,是儲存位址的變數。

c89明確規定,指標是乙個儲存物件位址的變數。這裡要注意的是,指標跟位址概念的不同,指標是一種位址變數,通常也叫指標變數,統稱指標。而位址則是位址變數的值。

感謝以下大佬的文章:

常見的指標與陣列名以及函式名之間的區分

可執行 如下 不過是將int型換成了char型 include stdafx.h int tmain int argc,tchar argv 該定義可行,優先順序大於 所以a是乙個陣列,char 代表字元指標,所以這是乙個包含4個字元指標的陣列。printf p p p p n a 0 a 1 a ...

C語言 關於函式名和陣列名的理解

說到函式名和陣列名,很多人對其代表的意思理解的還不是很清楚,甚至是錯誤的,本文試圖將其所代表的意思描述清楚。陣列的定義通常是如下這種型別 int a 10 首先說明,陣列名和指標雖然長得像,但是一點關係的沒有 比如無法a 很多用法都不同,可以當做兩個東西。考慮到陣列名作為右值的情況 某函式的實現如下...

陣列名a與陣列名取位址 a的差異

老話有句說 差之毫釐,謬以千里。人也分兩種,一種人是凡事盡善盡美型的,另一種人就是馬馬虎虎型的。int main int argc,char argv int ptr int a 1 printf d d a 1 ptr 1 getchar return 0 上面這段 的輸出為 2 5 關鍵是下面這...