欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言中如何通過指針參數(shù)返回值

 更新時(shí)間:2023年02月24日 10:04:30   作者:ISMidi  
這篇文章主要介紹了C語言中如何通過指針參數(shù)返回值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

簡單的案例

深夜無聊而引發(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++的對(duì)象模型

    深入理解C++的對(duì)象模型

    本文在介紹C++使用的對(duì)象模型之前,先介紹了2種對(duì)象模型:簡單對(duì)象模型(a simple object model)和表格驅(qū)動(dòng)對(duì)象模型(a table-driven object model),這樣介紹對(duì)后面的內(nèi)容更有幫助,有需要的小伙伴們可以參考學(xué)習(xí)。
    2016-08-08
  • C++中的字符串編碼處理方法

    C++中的字符串編碼處理方法

    這篇文章主要介紹了C++中的字符串編碼處理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • C語言實(shí)現(xiàn)二叉樹的搜索及相關(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-06
  • C++無痛實(shí)現(xiàn)日期類的示例代碼

    C++無痛實(shí)現(xiàn)日期類的示例代碼

    凡是要寫類必須要提到六大默認(rèn)成員(六位大爺):構(gòu)造函數(shù)、析構(gòu)函數(shù)、拷貝構(gòu)造函數(shù)、賦值重載函數(shù)、取地址重載函數(shù)(包括const對(duì)象和普通對(duì)象);那么這次的日期類又需要伺候哪幾位大爺呢?本文就來詳細(xì)說說
    2022-10-10
  • Matlab實(shí)現(xiàn)繪制玫瑰線的示例代碼

    Matlab實(shí)現(xiàn)繪制玫瑰線的示例代碼

    這篇文章主要為大家介紹了如何利用Matlab繪制3好看的玫瑰線,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,感興趣的小伙伴可以動(dòng)手試一試
    2022-08-08
  • C++雙向鏈表的增刪查改操作方法講解

    C++雙向鏈表的增刪查改操作方法講解

    相較單鏈表,雙向鏈表除了data與next域,還多了一個(gè)pre域用于表示每個(gè)節(jié)點(diǎn)的前一個(gè)元素。這樣做給雙向鏈表帶來了很多優(yōu)勢。本文主要介紹了雙向鏈表的實(shí)現(xiàn),需要的可以參考一下
    2023-03-03
  • C語言實(shí)現(xiàn)稀疏矩陣

    C語言實(shí)現(xiàn)稀疏矩陣

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)稀疏矩陣的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • C/C++產(chǎn)生指定范圍和不定范圍隨機(jī)數(shù)的實(shí)例代碼

    C/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
  • C++?指針傳遞的作用小結(jié)

    C++?指針傳遞的作用小結(jié)

    本文主要介紹了C++?指針傳遞的作用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • C語言中#define預(yù)處理語法總結(jié)

    C語言中#define預(yù)處理語法總結(jié)

    C語言里可以用#define定義一個(gè)標(biāo)識(shí)符來表示一個(gè)常量。特點(diǎn)是:定義的標(biāo)識(shí)符不占內(nèi)存,只是一個(gè)臨時(shí)的符號(hào),預(yù)編譯后這個(gè)符號(hào)就不存在了,也不做類型定義。預(yù)編譯又叫預(yù)處理
    2021-11-11

最新評(píng)論