cpp 與c之不同 指標

2021-07-28 11:28:41 字數 3034 閱讀 7435

void void_pointer()

output:

sizeof(void) = 1

pv = 0x7fff5fbff834, pi = 0x7fff5fbff834, *pi = 5

pv = 0x7fff5fbff835

pv = 0x7fff5fbff83a

總結:

void void_pointer()

總結:

c不支援函式過載,因此函式名唯一確定函式,因此如果函式宣告omit形參,編譯時函式呼叫會ignore形參檢查(形參個數和型別),如果函式執行異常,執行期才能發現,但如果沒有omit形參,編譯時函式呼叫會做形參檢查(形參個數和型別)

假如feed.c中定義如下函式

void feed(int rice, int meat)

在main.c中進行如下函式呼叫

void feed();

void call_feed()

output:

feed rice 1 and meat 1606416504

feed rice 5 and meat 73832

feed rice 5 and meat 8

feed rice 5 and meat 8

注:feed(),feed(5)實參缺失,函式執行異常,feed(5, 8, 58)傳遞了多餘實參

因為c不支援函式過載,feed()呼叫link時search _sub_feed_(不包含形參)目標**入口,而void feed(int rice, int meat)函式定義在目標**中入口位址為_sub_feed_(不包含形參),因此link時能search到,正確link

函式這個特性相應擴充套件到了函式指標型別,如果函式指標型別omit形參,編譯時函式指標型別ignore形參檢查(形參個數和型別),如果函式指標型別執行異常,執行期才能發現,但如果沒有omit形參,編譯時函式指標型別會做形參檢查(形參個數和型別),因此omit形參的函式指標型別(無參函式指標型別)與沒有omit形參的函式指標型別(含參函式指標型別)可相互轉換(函式返回型別必須一致)

void feed0()

void feed1(int rice)

void feed2(int rice, int meat)

void feed3(int rice, int meat, int fruit)

typedef void (*pfeed0)();

typedef void (*pfeed1)(int);

typedef void (*pfeed2)(int, int);

typedef void (*pfeed3)(int, int, int);

void fun_pointer()

output:

feed rice 0 and meat 0 and fruit 0

feed rice 5 and meat 0 and fruit 0

feed rice 5 and meat 8 and fruit 0

feed rice 5 and meat 8 and fruit 58

feed none

feed none

feed none

注:通過omit形參的函式指標型別(無參函式指標型別)呼叫函式時,ignore形參檢查(形參個數和型別)

c++支援函式過載,因此函式名+形參(形參個數和型別)唯一確定函式,omit形參的函式宣告僅僅表示無參函式宣告,沒有多餘其他含義,編譯時函式呼叫無論如何都會做形參檢查(形參個數和型別)

假如feed.cpp中定義如下函式

void feed(int rice, int meat)

在main.cpp中進行如下函式呼叫

void feed();

void call_feed()

注:編譯時,feed(5),feed(5, 8),feed(5, 8, 58)與函式宣告void feed()形參不匹配,而feed()儘管與函式宣告void feed()匹配,但link error

因為c++支援函式過載,feed()呼叫link時search _sub_feed_目標**入口(包含形參,表示無參),而void feed(int rice, int meat)函式定義在目標**中入口位址為_sub_feed_int_int_(包含形參,兩個形參int,int),因此link時search不到,link error

函式這個特性相應擴充套件到了函式指標型別,因此c++支援函式過載,因此omit形參的函式指標型別僅僅表示無參函式指標型別,沒有多餘其他含義,編譯時函式指標型別無論如何都會做形參檢查(形參個數和型別),因此omit形參的函式指標型別(無參函式指標型別)與沒有omit形參的函式指標型別(含參函式指標型別)不可相互轉換(函式返回型別必須一致)

void feed0()

void feed1(int rice)

void feed2(int rice, int meat)

void feed3(int rice, int meat, int fruit)

typedef void (*pfeed0)();

typedef void (*pfeed1)(int);

typedef void (*pfeed2)(int, int);

typedef void (*pfeed3)(int, int, int);

void fun_pointer()

output:

feed none

feed rice 5

feed rice 5 and meat 8

feed rice 5 and meat 8 and fruit 58

c和cpp中的那些不同(指標和陣列)

在c c 的學習中,經常能碰到因為c 為了相容c語法而產生的一些不同。或者說是語言上一些看起來相似的特性但是作用不完全相同或者完全不同的特性。為了做到把書越讀越薄,有必要做乙個整理,把這兩個相愛相殺的一些坑點列舉出來。因為也有不少大神關於這些問題做出了詳細解釋,所以我只寫出關鍵的易於區分的特點 更多...

把常量字串賦予不同陣列和不同指標之間的區別

有下面這樣乙個c語言函式 int text void char str1 good good study char str2 good good study char str3 good good study char str4 good good study if str1 str2 printf...

C 之指標與常量

該文為中國大學mooc上北京郵電大學崔毅東和楊談老師主講的 c 程式設計 物件導向高階 筆記整理 常量是程式中一塊資料,這個資料一旦宣告後就不能被修改 示例 const datatype constantname value 或datatype const constantname value 常量...