c語言函數(shù)返回結(jié)構(gòu)體指針 返回值為結(jié)構(gòu)體指針的函數(shù)怎么寫

C語言返回結(jié)構(gòu)的指針問題?

直接把結(jié)構(gòu)體變量傳遞參數(shù)是傳值,

創(chuàng)新互聯(lián)是專業(yè)的濮陽縣網(wǎng)站建設(shè)公司,濮陽縣接單;提供網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行濮陽縣網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

st *fun(struct st x)

這里的形參x其實是傳遞的實參y的拷貝,這和形參不能影響實參是同樣的道理。而且x在fun函數(shù)結(jié)束后就被系統(tǒng)回收了,取得的地址當(dāng)然就成野指針了,所以應(yīng)該用結(jié)構(gòu)體指針傳遞參數(shù):

#include?"stdio.h"

#include?"string.h"

struct?st

{

int?a;

char?b[10];

};

void?fun(struct?st?*px)

{

px-a?=?100;

strcpy(px-b,"99999");

}

int?main()

{

struct?st?y,?*p;

p?=?y;

y.a?=?999;

strcpy(y.b,"0");

printf("y.a=%d?y.b=%s\n",y.a,y.b);

fun(p);

printf("(*p).a=%d?(*p).b=%s\n",(*p).a,(*p).b);

}

求高手指教c語言函數(shù)怎么返回結(jié)構(gòu)體

#include "stdio.h"

struct abc{

int a;

int b;

char *p;

};

struct abc myabc(void){

struct abc n;

n.a=2;

n.b=3;

n.p=(char *)0x00FF3304;

return n;

}

void main(void)

{

struct abc x={1,2,(char *)0x00FF3300},y;

y=myabc();

printf("%d %d %p\n%d %d %p\n",x.a,x.b,x.p,y.a,y.b,y.p);

}

擴(kuò)展資料:

在C語言中,結(jié)構(gòu)體(struct)指的是一種數(shù)據(jù)結(jié)構(gòu),是C語言中聚合數(shù)據(jù)類型(aggregate data type)的一類。結(jié)構(gòu)體可以被聲明為變量、指針或數(shù)組等,用以實現(xiàn)較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)體同時也是一些元素的集合,這些元素稱為結(jié)構(gòu)體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。

C++提供了許多種基本的數(shù)據(jù)類型(如int、float、double、char等)供用戶使用。由于程序需要處理的問題往往比較復(fù)雜,而且呈多樣化,已有的數(shù)據(jù)類型顯得不能滿足使用要求。C++允許用戶根據(jù)需要自己聲明一些類型,用戶可以自己聲明的類型還有結(jié)構(gòu)體類型(structure)、共用體類型(union)、枚舉類型(enumeration)、類類型(class )等,這些統(tǒng)稱為用戶自定義類型(user-defined type,UDT)。

C語言結(jié)構(gòu)體函數(shù)的返回值是結(jié)構(gòu)體結(jié)構(gòu)體變量中的信息

你說的這種情況,函數(shù)返回的是整個結(jié)構(gòu)體,無論這個結(jié)構(gòu)體中包含了多少個成員,一個結(jié)構(gòu)體就只是一個變量(結(jié)構(gòu)體本身就是一個變量,無論它包含了多少個成員)。這樣,函數(shù)返回一個結(jié)構(gòu)體就意味著函數(shù)把結(jié)構(gòu)體中所有的成員都返回了。C語言函數(shù)的確只能有一個返回值,用返回結(jié)構(gòu)體的方式就很好地解決了需要返回多個返回值的問題。

return后面沒有0或1,說明這個函數(shù)是void類型的,這類函數(shù)本來就不需要有返回值,這里的return的意思并不是要返回某個值,而是退出這個函數(shù)的意思。

c語言函數(shù)返回字符串時必須要用指針嗎?如果返回結(jié)構(gòu)體呢?函數(shù)在返回那些類型值時必須要用指針?

所謂函數(shù)類型是指函數(shù)返回值的類型。在C語言中允許一個函數(shù)的返回值是一個指針(即地址),這種返回指針值的函數(shù)稱為指針型函數(shù)。

定義指針型函數(shù)的一般形式為:

類型說明符 *函數(shù)名(形參表)

{

…… /*函數(shù)體*/

}

其中函數(shù)名之前加了“*”號表明這是一個指針型函數(shù),即返回值是一個指針。類型說明符表示了返回的指針值所指向的數(shù)據(jù)類型。

如:

int *ap(int x,int y)

{

...... /*函數(shù)體*/

}

表示ap是一個返回指針值的指針型函數(shù),它返回的指針指向一個整型變量。

【例】本程序是通過指針函數(shù),輸入一個1~7之間的整數(shù),輸出對應(yīng)的星期名。

main(){

int i;

char *day_name(int n);

printf("input Day No:\n");

scanf("%d",i);

if(i0) exit(1);

printf("Day No:%2d--%s\n",i,day_name(i));

}

char *day_name(int n){

static char *name[]={ "Illegal day",

"Monday",

"Tuesday",

"Wednesday",

"Thursday",

"Friday",

"Saturday",

"Sunday"};

return((n1||n7) ? name[0] : name[n]);

}

本例中定義了一個指針型函數(shù)day_name,它的返回值指向一個字符串。該函數(shù)中定義了一個靜態(tài)指針數(shù)組name。name數(shù)組初始化賦值為八個字符串,分別表示各個星期名及出錯提示。形參n表示與星期名所對應(yīng)的整數(shù)。在主函數(shù)中,把輸入的整數(shù)i作為實參,在printf語句中調(diào)用day_name函數(shù)并把i值傳送給形參n。day_name函數(shù)中的return語句包含一個條件表達(dá)式,n值若大于7或小于1則把name[0]指針返回主函數(shù)輸出出錯提示字符串“Illegal day”。否則返回主函數(shù)輸出對應(yīng)的星期名。主函數(shù)中的第7行是個條件語句,其語義是,如輸入為負(fù)數(shù)(i0)則中止程序運(yùn)行退出程序。exit是一個庫函數(shù),exit(1)表示發(fā)生錯誤后退出程序,exit(0)表示正常退出。

應(yīng)該特別注意的是函數(shù)指針變量和指針型函數(shù)這兩者在寫法和意義上的區(qū)別。如int(*p)()和int *p()是兩個完全不同的量。

int (*p)()是一個變量說明,說明p是一個指向函數(shù)入口的指針變量,該函數(shù)的返回值是整型量,(*p)的兩邊的括號不能少。

int *p()則不是變量說明而是函數(shù)說明,說明p是一個指針型函數(shù),其返回值是一個指向整型量的指針,*p兩邊沒有括號。作為函數(shù)說明,在括號內(nèi)最好寫入形式參數(shù),這樣便于與變量說明區(qū)別。

對于指針型函數(shù)定義,int *p()只是函數(shù)頭部分,一般還應(yīng)該有函數(shù)體部分。

在ANSI C標(biāo)準(zhǔn)中允許用結(jié)構(gòu)變量作函數(shù)參數(shù)進(jìn)行整體傳送。但是這種傳送要將全部成員逐個傳送,特別是成員為數(shù)組時將會使傳送的時間和空間開銷很大,嚴(yán)重地降低了程序的效率。因此最好的辦法就是使用指針,即用指針變量作函數(shù)參數(shù)進(jìn)行傳送。這時由實參傳向形參的只是地址,從而減少了時間和空間的開銷。

【例】計算一組學(xué)生的平均成績和不及格人數(shù)。用結(jié)構(gòu)指針變量作函數(shù)參數(shù)編程。

struct stu

{

int num;

char *name;

char sex;

float score;}boy[5]={

{101,"Li ping",'M',45},

{102,"Zhang ping",'M',62.5},

{103,"He fang",'F',92.5},

{104,"Cheng ling",'F',87},

{105,"Wang ming",'M',58},

};

main()

{

struct stu *ps;

void ave(struct stu *ps);

ps=boy;

ave(ps);

}

void ave(struct stu *ps)

{

int c=0,i;

float ave,s=0;

for(i=0;i5;i++,ps++)

{

s+=ps-score;

if(ps-score60) c+=1;

}

printf("s=%f\n",s);

ave=s/5;

printf("average=%f\ncount=%d\n",ave,c);

}

本程序中定義了函數(shù)ave,其形參為結(jié)構(gòu)指針變量ps。boy被定義為外部結(jié)構(gòu)數(shù)組,因此在整個源程序中有效。在main函數(shù)中定義說明了結(jié)構(gòu)指針變量ps,并把boy的首地址賦予它,使ps指向boy數(shù)組。然后以ps作實參調(diào)用函數(shù)ave。在函數(shù)ave中完成計算平均成績和統(tǒng)計不及格人數(shù)的工作并輸出結(jié)果。

由于本程序全部采用指針變量作運(yùn)算和處理,故速度更快,程序效率更高。

網(wǎng)站名稱:c語言函數(shù)返回結(jié)構(gòu)體指針 返回值為結(jié)構(gòu)體指針的函數(shù)怎么寫
網(wǎng)頁鏈接:http://muchs.cn/article10/ddiiego.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)外貿(mào)建站、域名注冊、做網(wǎng)站、響應(yīng)式網(wǎng)站網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)