關於指標函數和函數指標的問題(一)

來源:互聯網
上載者:User

     函數指標和指標函數這是兩個不同的概念,但總是容易混淆。希望下面的這些對大家都能夠有所協助。

 

     從語言學的角度來講,函數指標和指標函數均屬偏正短語,所以根據這一點來看,這兩個概念的含義就比較好理解了。

 

     這裡我們先來看指標函數吧。

     所謂指標函數,在本質上來講,它屬於函數的範疇,只是他的傳回值不在是不同的值,而是一個指標值(或者說是一個地址)。這裡先讓我們看一個函數:

 

#include <stdio.h>
int *hello (int a, int b) {
 int c = a+b;
 return &c;
}
int main () {
 int a = 5;
 int b = 6;
 int *iPointer;
 iPointer = hello(a,b);
 printf("%0x/n",iPointer);
 printf("%d/n",&iPointer);
 return 0;
}

 

讓我想象一下這個函數會的兩條輸出語句的結果會是怎樣的呢?當然第一個輸出語句我們僅僅知道因該是一個地址值但我們是不知道具體是哪個地址值,而對第二個輸出語句,我們希望的是得到a+b的值(即11)。想一想,我們真的能得到想要的值嗎?也許能,也許不能。還是讓我們看看輸出結果吧:

 

 

這就是兩個輸出結果了,為什麼第二個不是11呢?這個問題,先暫時等一下在來探討了,這裡我們先看另一個問題,在上面的程式中有下面這樣一個函數:

 

int *hello (int a, int b) {
 int c = a+b;
 return &c;
}
我們能把其中的return &c;直接改寫成,return &(a+b);嗎?當然有一點點編程經驗的人都知道,這是當然不行的,不過在這裡還是想說一下,應為通常我們都習慣返回一些普通變數,所以常常會有return a+b;這樣的用法,所以有事我們容易犯一種習慣性思維,而返回return a+b;(當然,其理由在於,a+b作為計算的結果是作為右值返回的,是一個常量,而該函數要求的傳回值是一個指標,是一個地址值,因此,我們必須返回一個左值,而非右值)。

 

這裡我們該來解決上面遇到的第二個輸出不是我們想要的結果的問題了,仔細想想。在解開這個問題之前,我們先對上面的代碼做一個改動如下:

 

#include <stdio.h>
int c;
int *hello (int a, int b) {
 c = a+b;
 return &c;
}
int main () {
 int a = 5;
 int b = 6;
 int *iPointer;
 iPointer = hello(a,b);
 printf("-----%0x-----/n",iPointer);
 printf("-----%d-----/n",*iPointer);
 return 0;
}

 

這裡在讓我們看看其結果:

 

這裡我們得到了我們想要看到的11,相比上面代碼已經能夠告訴我們問題的所在了吧。當然這就涉及到範圍了,當然,範圍就本身而言是簡單的但當範圍與其他一些概念結合起來後就又變得複雜了,希望以後有機會了,在來探討範圍的問題。

 

      接下來,我們還是繼續我們話題的另一部分,函數指標。不用說,想必通過字面意思我們已經知道,函數指標其實就是說,是一個指向函數的指標,其實質是一個指標,只是這個指標指向的是一個函數。那麼既然如此,函數指標該怎樣定義有怎樣使用呢?對這個問題,對於多數人來說都得自己探索,應為指標在很多的程式設計語言中是不存在的,而對於教學中的基礎課C/C++對這一點涉及又是少之又少。下面,我們先來看看函數指標的定義方式吧:

資料類型標誌符 (指標變數名) (形參列表);

 

首先是資料類型標誌符,它是指函數指標所指向函數的傳回值類型,然後是(指標變數面),為什麼有個括弧呢?這就與符號的組合和運算子的優先順序有關了,我們知道括弧的優先順序高於指標。因此,若是沒有括弧的話,那麼按照優先預演算法則,就會成了指標函數了。當然,形參列表是可變的,當然也可以沒有形參,但是我們在使用時,必須注意函數指標所指向的函數的形參必須與函數指標的形參列表想具有相同的對應關係否則是無法通過編譯的。對於具體的用法,看下面的小程式,就不在囉嗦了。

 

#include <stdio.h>
int (*test)(int a, int b);
int hello(int a, int b) {
 return a+b;
}

int main () {
 int a,b;
 a = 5;
 b = 6;
 test = hello;
 printf("====%0x====/n",&test);
 printf("====%0x====/n",test);
 printf("====%0x====/n",*test);
 int c = test(a,b);
 return 0;
}

 

 

 

對於運算結果如下:

 

仔細看看,原來test和*test的結果是一樣的怎麼會這樣呢?這個問題留著下次再繼續探討了。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.