C程序解析:C語言的指針和函數返回值解析(二)

編程語言 C語言 Visual Studio 盤點 編程的奧祕 2017-05-01

承接上一篇C程序解析:C語言的數據類型和函數返回值解析(一),我們接著講解什麼是指針,學習之前,再回顧一遍“指針就是地址”這句話。

先舉一個形象的例子:

C程序解析:C語言的指針和函數返回值解析(二)

快遞員是怎麼送快遞的?

答曰:是按照郵件上的地址,把對應的郵件送到對應的地址處,也就是送到貨物主人那裡。

那我們要找快遞員郵寄東西,快遞員怎麼做呢?

答曰:快遞員按照你提供的地址,先找到你拿到郵寄品,再按照要郵寄的地址把快遞送到目的地。

我們在函數中定義的所有的變量(包括基本類型,數組,結構體等等)都是存放在計算機的內存當中的,計算機的內存就好比是由很多個規格相同的小倉庫組成的,每個小倉庫都有它自己的編號,這個編號就可以當做小倉庫的地址。當我們定義了一個變量時,計算機就會在內存中找到一個空閒的“小倉庫”,記下這個小倉庫的編號,並把我們定義的變量放進去;當我們要使用這個變量時,計算機就按照之前記下的編號去找對應的倉庫,把其中的值取出來提供給我們使用。是不是和快遞員的工作很類似~~

所謂指針就是上述的地址,具體點就是存放某一數據的內存地址,下圖就是一塊簡化的內存模式:

內存地址內存數據
0123
1a
23.14159
30
4NULL
5H

C語言中用一個 * 號表示這個變量是一個指針,指針定義方式:數據類型* 指針名

int a =10;

int* p = &a;

int m = *p;

& 是C語言的取地址符,就是取到對應變量的地址,上面第二行代碼定義了一個int型的指針變量p,int表示該指針指向的值的類型是整型,然後把a的地址賦給p,此時,p的值就是變量a的地址。第三行把*p賦給int型變量m,此處的 * 表示對指針進行解析,即取出指針所指向的值,所以m的值就等於p指向的值,也就是a,所以m=10。你可以自己把上面涉及到的幾個值打印出來,驗證一下。

指針可以指向任意類型的數據,包括基本類型,數組,結構體等,不過當指向數組或結構體時,指針表示的是該數組或結構體的首地址。這是因為數組或結構體含有多個變量,所以它們會佔據多個連續的“小倉庫”,所以只需要知道一個數組的首地址和數組的長度即可取到數組中的所有數據。

指針就先說到這,記住一句話“指針就是地址”。

現在說一下函數返回值的問題。

C語言中的函數返回值包括三種:void型,基本類型和指針類型。

返回值是void類型表示函數沒有返回值。

返回值是基本類型的很常見,比如main函數的返回值就是基本類型int,我們在C程序解析:用C語言編寫你的第一個自定義函數中定義的函數返回值也是基本類型。

返回值是指針類型,表示函數返回的是一個指針,這個指針可以是指向任意類型的指針,比如數組和結構體,利用這一特性,我們可以巧妙地完成一些事情。

比如下面的函數:

#include<stdio.h>

int a[4] = { 1, 2, 3, 4 };

int* add(int x){

a[0] = a[0]+x;

a[1] = a[1]+x;

a[2] = a[2]+x;

a[3] = a[3]+x;

return a;

}

int main(){

int x = 7;

printf("a[0]= %d a[1]= %d a[2]= %d a[3]= %d\n",a[0],a[1],a[2],a[3]);

int* m = add(x);

printf("m[0]=%d m[1]=%d m[2]=%d m[3]=%d\n",m[0],m[1], m[2],m[3]);

printf("a[0]= %d a[1]= %d a[2]= %d a[3]= %d\n", a[0], a[1], a[2], a[3]);

return 0;

}

我們定義的add函數的返回類型是指向int型的指針在這個函數中對數組a中的每一個值增加x,最後返回數組a的指針(對於數組,其數組名就是這個數組的首地址,即數組的指針);

再看main函數,我們先輸出數組a的原始值,然後調用add函數,把add函數的返回值賦給指針m

最後輸出此時數組m和數組a的值。

顯而易見的是:main函數中第一次輸出數組a的值時,應該輸出數組a的初始值,即1,2,3,4

調用add函數後,數組a中的的所有值都增加了7,所以此時a中的值應是8,9,10,11

而m是add函數的返回值,add函數返回了數組a的指針,所以m就指向了數組a,因此,m的值應與a的值一致,即8,9,10,11

我們放入visualstudio中驗證一下,編譯運行,輸出如下:

C程序解析:C語言的指針和函數返回值解析(二)

這樣,我們就巧妙地通過返回指向數組的指針,間接實現了調用一次函數返回多個相同類型的數值!

如果我們要一次返回多個不同類型的值該怎麼辦?哈哈,很簡單,將函數返回類型定義為指向結構體的指針,然後返回一個結構體指針,就間接實現了返回多個不同類型的值!因為數組中存放的是多個相同類型的值,而結構體中可以存放多個不同類型的值(當然,結構體也可以存放多個相同類型的值,這樣的結構體就與數組沒有什麼區別了)。

有什麼問題歡迎在評論區提出~

祝大家五一勞動節快樂!

C程序解析:C語言的指針和函數返回值解析(二)

相關推薦

推薦中...