C語言中如何通過指針參數(shù)返回值
簡單的案例
深夜無聊而引發(fā)的問題
一般來說,在C語言中一個(gè)函數(shù)頂多只能返回一個(gè)值,那么我們?nèi)绾卧O(shè)計(jì)能巧妙的返回多個(gè)我們需要的值呢?
先來看簡單的題,我們有一個(gè)長度為10的int型數(shù)組
int arr[] = {1,8,10,2,-5,0,7,15,4,-5};
現(xiàn)在我們需要寫一個(gè)函數(shù),找出此數(shù)組中最大值和最小值。
滑稽.jpg(若是不用寫函數(shù),直接通過for遍歷我們直接就能遍歷到最大值和最小值)
但可惡的是必須用函數(shù)來解決,此時(shí)函數(shù)中只能返回一個(gè)值,那我們是不是非得寫兩個(gè)函數(shù)?
我們完全可以通過指針的特性,從函數(shù)中取得多個(gè)我們需要的“值”
回歸正題
我們?cè)趍ain函數(shù)中 定義我們需要用到的指針
int *pmax,*pmin;
接下來 來寫我們的功能函數(shù)
void find_max_and_min(int **pmax,int **pmin, int arr[]) { ?? ?*pmax = *pmin = arr; ?? ?int i; ?? ? ?? ?for(i=0;i<10;i++) { ?? ??? ?if(**pmax < arr[i]) { ?? ??? ??? ?*pmax = arr+i; ?? ??? ?} ?? ??? ?if(**pmin > arr[i]) { ?? ??? ??? ?*pmin = arr+i; ?? ??? ?} ?? ?} }
此時(shí)我們注意到,功能函數(shù)中傳入的參數(shù)分布為兩個(gè)指向指針的指針,以及我們需要查找的數(shù)組。
主函數(shù)中
int *pmax,*pmin; find_max_and_min(&pmax,&pmin,arr);? printf("%d,%d",*pmax,*pmin);
即可在arr中找出我們需要的“返回值”
敲重點(diǎn),敲重點(diǎn):我們將 指針 pmax和pmin的地址 傳給了函數(shù)find_max_and_min。
完整代碼:
#include<stdio.h> #include<stdlib.h> void find_max_and_min(int **pmax,int **pmin, int arr[])? { ?? ?*pmax = *pmin = arr; ?? ?int i=0; ?? ?for (i;i<10;i++)? ?? ?{ ?? ??? ?if(**pmax < arr[i])? ?? ??? ?{ ?? ??? ??? ?*pmax = arr+i; ?? ??? ?} ?? ??? ?if(**pmin > arr[i])? ?? ??? ?{ ?? ??? ??? ?*pmin = arr+i; ?? ??? ?} ?? ?} } int main()? { ?? ?int arr[] = {1,8,10,2,-5,0,7,15,4,-5}; ?? ?int *pmax,*pmin; ?? ?find_max_and_min(&pmax,&pmin,arr); ?? ?printf("%d,%d",*pmax,*pmin); ?? ?return 0; }
簡單的案例2.0
鏈表中"迷人"的指針
typedef struct LNode { ? ? Elemtype data; ? ? struct LNode *next; }LNode,*LinkList;
這是之前上數(shù)據(jù)結(jié)構(gòu)課的鏈表代碼,從老師的代碼中不難發(fā)現(xiàn)分別定義了LNode和 *LinkList
當(dāng)時(shí)心想: “已經(jīng)定義了 LNode,要用到結(jié)構(gòu)體指針的時(shí)候 直接*LNode就好了,為啥還要定義個(gè) *LinkList 呢 ” 后來逐漸恍然大悟~
凡事先看主函數(shù)
int main() { ? ? LinkList head; ? ? //head 頭指針? ? ? createlist(&head); ? ? initlist(head); ? ? findrabbit(head); ? ? printf("\n");? ? ? outputlist(head); ? ? return 0; }
這里的 LinkList head; 相當(dāng)于 LNode * head;
敲重點(diǎn)敲重點(diǎn),createlist(&head);
嗯哼 此時(shí)并沒有任何返回的指針,是在head頭基礎(chǔ)上進(jìn)行操作的。
并且,在createlist函數(shù)中是對(duì) 頭指針(head) 進(jìn)行 取地址(&head),和我們上面的 &pmax,&pmin妙處相同。(沒理解的同學(xué)認(rèn)真想想)
void createlist(LinkList *head) { ? ? int i; ? ? *head=(LinkList)malloc(sizeof(LNode)); ? ?? ? ? (*head)->data = 0; ? ? LinkList p,tem; ? ? tem = *head; ?? ? //?? ?頭插法 循環(huán)單鏈表 ? ? ? for(i=0;i<NUMS;i++) ? ? { ? ? ? ? p=(LinkList)malloc(sizeof(LNode)); ? ? ? ? tem->next = p; ? ? ? ? tem = p; ? ? ? ?? // ? ? ? ?(*head)->data++; ? //計(jì)數(shù)用? ? ? } ?? ?tem->next = *head; }
這里的LinkList *head 等價(jià)于 LNode **head
終于理解了老師代碼用心之處~~
再度分析
傳值和傳指針,其實(shí)都是傳值。 你需要傳的是指向指針的地址,并通過函數(shù)對(duì)這個(gè)地址中的內(nèi)容進(jìn)行操作
指針本身也是一個(gè)變量類型,無論變量如何,都應(yīng)該使用地址傳參,使用取地址符:&
另外再給學(xué)數(shù)據(jù)結(jié)構(gòu)的同學(xué)兩種使用結(jié)構(gòu)體進(jìn)行操作的寫法
寫法一:直接通過函數(shù)返回指針:
LinkList init(LinkList L) { ?? ?L = (LinkList)malloc(sizeof(LNode)); ?? ?... ?? ?return L } int main() { ?? ?LinkList L; ?? ?L = init(L); }
寫法二:向函數(shù)傳遞指針變量的地址,通過函數(shù)修改其指向的內(nèi)容
void init(LinkList *L) { ?? ?*L = (LinkList)malloc(sizeof(LNode)); ?? ?... } int main() { ?? ?LinkList L; ?? ?init(&L); }
重在理解。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實(shí)現(xiàn)二叉樹的搜索及相關(guān)算法示例
這篇文章主要介紹了C語言實(shí)現(xiàn)二叉樹的搜索及相關(guān)算法,結(jié)合具體實(shí)例形式分析了基于C語言創(chuàng)建、遍歷、搜索等相關(guān)算法與實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-06-06C/C++產(chǎn)生指定范圍和不定范圍隨機(jī)數(shù)的實(shí)例代碼
C/C++產(chǎn)生隨機(jī)數(shù)用到兩個(gè)函數(shù)rand() 和 srand(),這里介紹不指定范圍產(chǎn)生隨機(jī)數(shù)和指定范圍產(chǎn)生隨機(jī)數(shù)的方法代碼大家參考使用2013-11-11