菜鳥C 自學筆記 指標 下

2021-09-22 05:13:10 字數 3518 閱讀 4786

繼續上篇指標未完成的學習任務。

指向函式的指標包含函式的位址,可以通過指標呼叫該函式。下面這種格式宣告了乙個函式指標:

int (*fpt)();

指標的名字是fpt。這個特殊的指標指向乙個返回整數值並且不接受實參的函式。指標宣告必須與指標所指函式的宣告相匹配。

#include 

"stdafx.h

"#include 

<

iostream

>

void

filefunc(),editfunc();

intmain(

intargc, 

char

*ar**)

void

filefunc()

void

editfunc()

執行效果如下:

通過使用函式指標的陣列,可以建立乙個有限狀態機,程式行為取決於變數的值,根據變數值確定程式接下來執行哪個函式。**驅動的選單管理程式就是乙個有限狀態機的例子。

如下demo演示了如何通過4個原型選單分別顯示一條訊息:

#include 

"stdafx.h

"#include 

<

iostream

>

struct

menu;

void

filefunc();

void

editfunc();

void

viewfunc();

void

exitfunc();

menu menu=,

,,};const

intsels

=sizeof

menu

/sizeof

(menu);

intmain(

intargc, 

char

*ar**)

std::cout

<<

"select:";

std::cin

>>

sel; 

if(sel

<

sels+1

&&sels

>0)

}return0;

}void

filefunc()

void

editfunc()

void

viewfunc()

void

exitfunc()

執行效果:

指向指標的指標可能不太容易處理。需要兩個星號宣告指標。如下所示:

char** opp;

可以由此類推,三個四個等多個星星,對應指向幾個指標的指標。

下面有乙個demo演示如何使用乙個被呼叫函式修改呼叫函式的區域性指標,並處理指標陣列:

#include 

"stdafx.h

"#include 

<

iostream

>

void

findcredit(

float

**fpp);

intmain(

intargc, 

char

*ar**)

;float*fp

=values;

findcredit(

&fp);

std::cout

<

fp<

";return0;

}void

findcredit(

float

**fpp)

else}}

執行效果如下:

上面程式用陣列位址初始化fp 指標,並把fp 指標的位址傳遞給findcredit函式,該函式將指向指標的指標作為其唯一形參的實參。findcredit用**fpp表示式間接地提取陣列元素值。findcredit函式遞增呼叫函式指標向陣列的指標,而不是遞增自己指向呼叫函式指標的區域性指標,以便在陣列的迴圈訪問中查詢負值。(*fpp)++;語句的含義是遞增指標形參所指定的內容,。而當遇到負值則跳出迴圈體。程式結束。

指向指標的指標的另一種用法是處理指標陣列。

下面的demo演示了如何通過指向指標陣列的指標列印出陣列內容:

#include 

"stdafx.h

"#include 

<

iostream

>

char

*names=;

intmain(

intargc, 

char

*ar**)

return0;

} 執行效果如下:

如上**,把nm 指標初始化為字元指標陣列names的位址。每個std::count呼叫都傳遞nm指標所指的字元指標,然後遞增指標,指向陣列的下乙個元素(指標)。

當我們宣告乙個指向const 變數的指標時,意味著程式不能通過指標修改變數。宣告形式如下:

const char* str;

任何對str指標所指字元資料的引用必須為唯讀的。這種用法有幾層含義。首先,不能將乙個const 變數的位址賦予指標,除非指標按上面的方式宣告。此外,如果函式的某個形參被宣告為指向乙個非const 的變數指標,就不能把const 變數的位址對應該形參的實參傳遞給函式。看如下demo:

#include 

"stdafx.h

"#include 

<

iostream

>

void

cpytoupper(

char

*s1,

const

char

*s2)

intmain(

intargc, 

char

*ar**)

執行效果如下:

我們可以定義在初始化後就不能改變自身內容的指標,這種做法可以增加**的安全性。如果指標永遠不用於迭代,換言之,如果這個指標永遠保持其初始值,就按下面的方式將其宣告為const指標變數:

char* const ptr=buf;

這裡就不細究了。

void 指標可以指向任何型別的變數,其宣告方式如下:

void* vptr;

任何位址都可以賦給void 指標,除非使用了型別強型轉換,否則就不能用void 指標來取出乙個變數值。

關於指標的學習,暫時到這裡,以後再回頭來加深下理解。

菜鳥C 自學筆記 指標 下

繼續上篇指標未完成的學習任務。指向函式的指標指向指標的指標指向指標陣列的指標指向const 變數的指標const 指標變數void 指標int fpt 指標的名字是fpt。這個特殊的指標指向乙個返回整數值並且不接受實參的函式。指標宣告必須與指標所指函式的宣告相匹配。include stdafx.h ...

C語言自學筆記 C函式和指標

函式指標 主語是指標,即指向函式的指標。可以參照整型指標,字元型指標等概念來理解 函式指標實際上是函式 在記憶體中的起始位址。示例 int sub num1,num2 a,int宣告函式的返回值是整型 b,sub 通過 結合兩個物件使他們具有更高的運算優先順序,通知編譯器這是乙個指標型別的物件 c,...

菜鳥自學Linux 命令 學習筆記(一)

1.常用linux指令 shutdown rh now 簡單的關機指令,雖然菜鳥們長按關機鍵強制關機,顯示屏也黑了,最終強制關機前丟失一些未儲存的資料也不是沒有可能的,結果不安全有隱患。於是我的習慣改變,開啟控制台 我使用的系統是linux mint 核心是linux 18.2,window的小夥伴...