一個(gè)函數(shù)可以返回一個(gè)整型值、字符值、實(shí)型值等,也可以返回指針型的數(shù)據(jù),即地址。其概念與以前類似,只是返回的值的類型是指針類型而已。
目錄
一、引入
二、返回指針值的函數(shù)的定義
2.1舉例說明1
2.2舉例說明2
一、引入
一個(gè)函數(shù)可以返回一個(gè)整型值、字符值、實(shí)型值等,也可以返回指針型的數(shù)據(jù),即地址。其概念與以前類似,只是返回的值的類型是指針類型而已。
例如 “ int *a(int x,int y); ”,a 是函數(shù)名,調(diào)用它以后能得到一個(gè) int* 型(指向整型數(shù)據(jù))的指針,即整型數(shù)據(jù)的地址。x 和 y 是函數(shù) a 的形參,為整型。
請(qǐng)注意在 “ *a ”兩側(cè)沒有括號(hào),在 a 的兩側(cè)分別為 * 運(yùn)算符和 () 運(yùn)算符。而 () 優(yōu)先級(jí)高于 * ,因此 a 先與 () 結(jié)合,顯然這是函數(shù)形式。這個(gè)函數(shù)前面有一個(gè) *,表示此函數(shù)是指針型函數(shù)(函數(shù)值是指針)。最前面的 int 表示返回的指針指向整型變量。
二、返回指針值的函數(shù)的定義
定義返回指針值的函數(shù)的原型的一般形式為:
類型名 *函數(shù)名(參數(shù)表列);
對(duì)初學(xué)C語言的人來說,這種定義形式可能不大習(xí)慣,容易弄錯(cuò),使用時(shí)要十分小心。通過下面的例子可以初步了解怎樣使用返回指針的函數(shù)。
2.1舉例說明1
舉例:有 a 個(gè)學(xué)生,每個(gè)學(xué)生有 b 門課程的成績(jī)。要求在用戶輸入學(xué)生序號(hào)以后,能輸出該學(xué)生的全部成績(jī),用指針函數(shù)來實(shí)現(xiàn)。
#include <stdio.h>
int main()
{
float score[][4] = { {60, 70, 80, 90}, { 56,89 ,67,88 }, { 34,78,90,66 } };
float* search(float(*pointer)[4], int n); //函數(shù)聲明
float* p;
int k;
printf("輸入要找的學(xué)生的序號(hào):");
scanf_s("%d", &k);
printf("The scores of No.%d are:\n", k);
p = search(score, k); //調(diào)用search函數(shù),返回score[k][0]的地址
for (int i = 0; i < 4; i++)
printf("%5.2f\t", *(p + i)); //輸出score[k][0]-score[k][3]的值
printf("\n");
return 0;
}
float* search(float(*pointer)[4], int n) //形參pointer是指向一維數(shù)組的指針變量
{
float* pt;
pt = *(pointer + n); //pt的值是&score[k][0]
return pt;
}
運(yùn)行結(jié)果:
程序分析:
函數(shù) search 定義為指針型函數(shù),它的形參 pointer 是指向包含 4 個(gè)元素的一維數(shù)組的指針變量。 pointer+1 指向 score 數(shù)組序號(hào)為 1 的行(學(xué)生序號(hào)是從0號(hào)算起的)。*(pointer+1)指向 1 行 0 列元素(對(duì) pointer+1 加了 “ * ” 號(hào)后,指針從行控制轉(zhuǎn)化為列控制了)。search 函數(shù)中的 pt 是指針變量,它指向 float 型變量(而不是指向一維數(shù)組)。main 函數(shù)調(diào)用 search 函數(shù),將 score 數(shù)組首行地址傳給形參 pointer (注意 score 也是指向行的指針,而不是指向列元素的指針)。k 是要查找的學(xué)生序號(hào)。調(diào)用 search 函數(shù)后,main 函數(shù)得到一個(gè)地址 &score[k][0] (指向第 k 個(gè)學(xué)生第 0 門課程),賦給 p。然后將此學(xué)生的 4 門課程的成績(jī)輸出。注意 p 是指向 float 型數(shù)據(jù)的指針變量,*(p+i) 表示該學(xué)生第 i 門課程的成績(jī)。
2.2舉例說明2
舉例:對(duì)2.1中的程序,找出其中有不及格的課程的學(xué)生及其學(xué)生號(hào)。
#include <stdio.h>
int main()
{
float score[][4] = { {60,70,80,90},{56,89,67,88},{34,78,90,66} };
float* search(float(*pointer)[4]); //函數(shù)聲明
float* p;
for (int i = 0; i < 3; i++) //循環(huán)3次
{
p = search(score + i); //調(diào)用search函數(shù),如有不及格返回score[i][0]的地址,否則返回NULL
if (p == *(score + i)) //如果返回的是score[i][0]的地址,表示p的值不是NULL
{
printf("No.%d score:", i);
for (int j = 0; j < 4; j++)
{
printf("%5.2f ", *(p + j)); // 輸出score[i][0]score[i][3]的值
}
printf("\n");
}
}
return 0;
}
float* search(float(*pointer)[4]) //定義函數(shù),形參pointer是指向一維數(shù)組的指針變量
{
float* pt = NULL; //先使pt的值為NULL
for (int i = 0; i < 4; i++)
{
if (*(*pointer + i) < 60)
pt = *pointer; //如果有不及格課程,使pt指向scoreL[i][0]
}
return pt;
}
運(yùn)行結(jié)果:
程序分析:
函數(shù) search 的作用是檢查一個(gè)學(xué)生有無不及格的課程。在 search 函數(shù)中的 pointer 是指向一維數(shù)組(有 4 個(gè)元素)的指針變量。pt 為指向 float 型變量的指針變量。從實(shí)參傳給形參 pointer 的是 score+i,它是 score 第 i 行的首地址,在 search 函數(shù)中,先使 pt=NULL (即 pt=0 )。用 pt 作為區(qū)分有無不及格課程的標(biāo)志。若經(jīng)檢查 4 門課中有不及格的,就使 pt 指向本行 0 列元素,即 pt=&score[i][0];若無不及格則保持 pt 的值為NULL。將 pt 返回 main 函數(shù)。在 main 函數(shù)中,把調(diào)用 search 得到的函數(shù)值(指針變量 pt 的值)賦給 p。用 if 語句判斷 p 是否等于 *(score+i),若相等,表示所查的序號(hào)為 i 的學(xué)生有不及格課程( p的值為 *( score+i ),即 p 指向 i 行 0 列元素),就輸出該學(xué)生(有不及格課程的學(xué)生) 4 門課成績(jī)。若無不及格,p的值是NULL,不輸出。
C語言指針操作系列文章:
C語言指針操作(一)地址,指針,指針變量是什么
C語言指針操作(二)指針變量作為函數(shù)參數(shù)
C語言指針操作(三)通過指針引用數(shù)組
C語言指針操作(四)用數(shù)組名作函數(shù)參數(shù)
C語言指針操作(五)通過指針引用多維數(shù)組
C語言指針操作(六)通過指針引用字符串
C語言指針操作(七)指向函數(shù)的指針
C語言指針操作(八)返回指針值的函數(shù)
C語言指針操作(九)指針數(shù)組和多重指針
C語言指針操作(十)動(dòng)態(tài)內(nèi)存分配與指向它的指針變量文章來源:http://www.zghlxwxcb.cn/news/detail-721886.html
C語言指針操作(十一)有關(guān)指針的小結(jié)文章來源地址http://www.zghlxwxcb.cn/news/detail-721886.html
到了這里,關(guān)于C語言指針操作(八)返回指針值的函數(shù)詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!