當前位置:首頁 » 編程語言 » 返回結構體指針c語言

返回結構體指針c語言

發布時間: 2023-01-17 20:18:51

c語言函數能不能返回結構體

c語言函數可以返回結構體,操作方法如下:

1、首先在電腦中打開visual studio新建項目,給這個結構體取個名字叫student。

㈡ C語言返回結構的指針問題

直接把結構體變數傳遞參數是傳值,

st *fun(struct st x)

這里的形參x其實是傳遞的實參y的拷貝,這和形參不能影響實參是同樣的道理。而且x在fun函數結束後就被系統回收了,取得的地址當然就成野指針了,所以應該用結構體指針傳遞參數:

#include"stdio.h"
#include"string.h"
structst
{
inta;
charb[10];
};
voidfun(structst*px)
{
px->a=100;
strcpy(px->b,"99999");
}
intmain()
{
structsty,*p;
p=&y;
y.a=999;
strcpy(y.b,"0");
printf("y.a=%dy.b=%s ",y.a,y.b);
fun(p);
printf("(*p).a=%d(*p).b=%s ",(*p).a,(*p).b);
}

㈢ 求解一個c語言函數返回結構體指針的問題

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<fstream>
#include<stdlib.h>
usingnamespacestd;

typedefstructpoint{//結構體設計
intA,B,C,a,b,c,id,n;
}point;
point*ReadFile(){
staticpointss[110];
chardata[50]={''};
intm1=0,n=0,k,i;
for(inti=0;i<100;i++){
ss[i].id=rand()%10;
ss[i].A=rand()%10;
ss[i].B=rand()%10;
ss[i].C=rand()%10;
ss[i].D=rand()%10;
ss[i].E=rand()%10;
ss[i].F=rand()%10;
}
returnss;
}
voidmain(){
pointmale[110],female[110],players[110];
male=ReadFile();
}

ss是局部變數,有效范圍只局限於定義ss的函數體內,即只在函數ReadFile里有效,函數返回後,ss就失效了。

你可以在ReadFile里定義ss的前面加上static修飾,表示這個是靜態局部變數,靜態局部變數的內存有效范圍可以全局有效。

static point ss[110];

另外,結構體的typedef定義不完整。

㈣ c語言函數返回字元串時必須要用指針嗎如果返回結構體呢函數在返回那些類型值時必須要用指針

所謂函數類型是指函數返回值的類型。在C語言中允許一個函數的返回值是一個指針(即地址),這種返回指針值的函數稱為指針型函數。
定義指針型函數的一般形式為:
類型說明符 *函數名(形參表)
{
…… /*函數體*/
}
其中函數名之前加了「*」號表明這是一個指針型函數,即返回值是一個指針。類型說明符表示了返回的指針值所指向的數據類型。
如:
int *ap(int x,int y)
{
...... /*函數體*/
}
表示ap是一個返回指針值的指針型函數,它返回的指針指向一個整型變數。
【例】本程序是通過指針函數,輸入一個1~7之間的整數,輸出對應的星期名。
main(){
int i;
char *day_name(int n);
printf("input Day No:\n");
scanf("%d",&i);
if(i<0) 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((n<1||n>7) ? name[0] : name[n]);
}

本例中定義了一個指針型函數day_name,它的返回值指向一個字元串。該函數中定義了一個靜態指針數組name。name數組初始化賦值為八個字元串,分別表示各個星期名及出錯提示。形參n表示與星期名所對應的整數。在主函數中,把輸入的整數i作為實參,在printf語句中調用day_name函數並把i值傳送給形參n。day_name函數中的return語句包含一個條件表達式,n值若大於7或小於1則把name[0]指針返回主函數輸出出錯提示字元串「Illegal day」。否則返回主函數輸出對應的星期名。主函數中的第7行是個條件語句,其語義是,如輸入為負數(i<0)則中止程序運行退出程序。exit是一個庫函數,exit(1)表示發生錯誤後退出程序,exit(0)表示正常退出。
應該特別注意的是函數指針變數和指針型函數這兩者在寫法和意義上的區別。如int(*p)()和int *p()是兩個完全不同的量。
int (*p)()是一個變數說明,說明p是一個指向函數入口的指針變數,該函數的返回值是整型量,(*p)的兩邊的括弧不能少。
int *p()則不是變數說明而是函數說明,說明p是一個指針型函數,其返回值是一個指向整型量的指針,*p兩邊沒有括弧。作為函數說明,在括弧內最好寫入形式參數,這樣便於與變數說明區別。
對於指針型函數定義,int *p()只是函數頭部分,一般還應該有函數體部分。

在ANSI C標准中允許用結構變數作函數參數進行整體傳送。但是這種傳送要將全部成員逐個傳送,特別是成員為數組時將會使傳送的時間和空間開銷很大,嚴重地降低了程序的效率。因此最好的辦法就是使用指針,即用指針變數作函數參數進行傳送。這時由實參傳向形參的只是地址,從而減少了時間和空間的開銷。
【例】計算一組學生的平均成績和不及格人數。用結構指針變數作函數參數編程
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;i<5;i++,ps++)
{
s+=ps->score;
if(ps->score<60) c+=1;
}
printf("s=%f\n",s);
ave=s/5;
printf("average=%f\ncount=%d\n",ave,c);
}

本程序中定義了函數ave,其形參為結構指針變數ps。boy被定義為外部結構數組,因此在整個源程序中有效。在main函數中定義說明了結構指針變數ps,並把boy的首地址賦予它,使ps指向boy數組。然後以ps作實參調用函數ave。在函數ave中完成計算平均成績和統計不及格人數的工作並輸出結果。
由於本程序全部採用指針變數作運算和處理,故速度更快,程序效率更高。

㈤ C語言返回結構指針的函數

進入fun函數時,會創建一個局部變數形參stu,這個形參stu與實參stu1不是一回事,stu只是與stu1數據一模一樣的復製品而已。當fun函數對stu操作結束後返回stu的指針,但因為stu是局部變數,在fun函數結束後會釋放掉,由於main函數使用fun函數返回的指針pp,pp指向了已被釋放掉的stu,所以列印時必然輸出些亂碼。

熱點內容
c語言期末試卷 發布:2025-07-17 05:49:58 瀏覽:404
64位access資料庫 發布:2025-07-17 05:35:58 瀏覽:374
php文件的相對路徑 發布:2025-07-17 05:34:22 瀏覽:711
矢量的叉乘運演算法則 發布:2025-07-17 05:29:41 瀏覽:661
dell雲存儲伺服器 發布:2025-07-17 05:21:06 瀏覽:255
銑床怎麼編程 發布:2025-07-17 05:20:29 瀏覽:776
sql11oracle 發布:2025-07-17 05:15:39 瀏覽:744
全國各地移動dns伺服器ip地址 發布:2025-07-17 05:07:47 瀏覽:312
sdvn加密 發布:2025-07-17 05:01:36 瀏覽:739
怎麼提取電腦緩存中的音樂 發布:2025-07-17 04:53:14 瀏覽:27