直接把結(jié)構(gòu)體變量傳遞參數(shù)是傳值,
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)魯?shù)?十余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):028-86922220
st *fun(struct st x)
這里的形參x其實是傳遞的實參y的拷貝,這和形參不能影響實參是同樣的道理。而且x在fun函數(shù)結(jié)束后就被系統(tǒ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);
}
這種方式叫做“用指針函數(shù)*creat()的返回值來傳遞動態(tài)內(nèi)存”,這是一個C語法
首先你要注意,子函數(shù)*creat()用了malloc動態(tài)申請內(nèi)存,而return返回的是指針變量所指向的地址,而不是指針!相當于將你所申請的動態(tài)內(nèi)存返回給主函數(shù)
int
*fun(void)//這里是指針函數(shù)
{
int
*p
=
(int
*)
malloc
(int);//動態(tài)申請內(nèi)存//p在這里指向了一塊合法內(nèi)存的地址
return
p;
}
void
main(void)
{
int
*q
=
NULL;
q
=
fun();//fun()返回指針p所指向的地址,(指針p是在棧上創(chuàng)建的,所以*fun()函數(shù)運行完,指針所分配的內(nèi)存被系統(tǒng)自動釋放)這時q指向p,得到了malloc所申請到的內(nèi)存
free(q);//釋放動態(tài)內(nèi)存
}
進入fun函數(shù)時,會創(chuàng)建一個局部變量形參stu,這個形參stu與實參stu1不是一回事,stu只是與stu1數(shù)據(jù)一模一樣的復(fù)制品而已。當fun函數(shù)對stu操作結(jié)束后返回stu的指針,但因為stu是局部變量,在fun函數(shù)結(jié)束后會釋放掉,由于main函數(shù)使用fun函數(shù)返回的指針pp,pp指向了已被釋放掉的stu,所以打印時必然輸出些亂碼。
#includestdio.h
#includestring.h
#includeiostream
#includefstream
#includestdlib.h
using?namespace?std;
typedef?struct?point{????????????????????????????//結(jié)構(gòu)體設(shè)計
int?A,?B,?C,?a,?b,?c,?id,?n;
}point;
point?*ReadFile(){???????????????
static?point?ss[110];
char?data[50]?=?{'\0'};
int?m1?=?0,?n?=?0,?k,?i;
for(int?i?=?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;
}????
return?ss;
}
void?main(){
point?male[110],?female[110],?players[110];
male?=?ReadFile();
}
ss是局部變量,有效范圍只局限于定義ss的函數(shù)體內(nèi),即只在函數(shù)ReadFile里有效,函數(shù)返回后,ss就失效了。
你可以在ReadFile里定義ss的前面加上static修飾,表示這個是靜態(tài)局部變量,靜態(tài)局部變量的內(nèi)存有效范圍可以全局有效。
static point ss[110];
另外,結(jié)構(gòu)體的typedef定義不完整。
搞定
額 , 現(xiàn)在可以直接用b , 因為 數(shù)組 變量b 本身是不能修改的, 而且 函數(shù)結(jié)束后 b 的生命就結(jié)束了。
所以 我在 b的前面 加了static
for(i=r;*(ch+i)!='\0';i++) //找到 目標函數(shù)的結(jié)尾
for(j=0;j=i-r+1;j++) // i-r 是 從m到最后字符串的長度
*(b+j)=*(ch+r-1+j); //拷貝
char * x= b;
return x;
復(fù)制以下的
#includestdio.h
void main()
{
char a[20];int m=0;char*fuzhi(char*,int);
printf("輸入字符:");
gets(a);
printf("輸入起始位數(shù):");
scanf("%d",m);
printf("%s\n",fuzhi(a,m));
}
char *fuzhi(char*ch,int r)
{static char b[20];int i,j;
for(i=r;*(ch+i)!='\0';i++)
for(j=0;j=i-r+1;j++)
*(b+j)=*(ch+r-1+j);
char * x= b;
return x;
}
c語言函數(shù)可以返回結(jié)構(gòu)體,操作方法如下:
1、首先在電腦中打開visual studio新建項目,給這個結(jié)構(gòu)體取個名字叫student。
2、然后添加變量,如下圖所示。
3、然后給結(jié)構(gòu)體類型指針p申請堆空間,如下圖所示。
4、接著使用for循環(huán)給結(jié)構(gòu)體賦值,如下圖所示。
5、最后在通過for循環(huán)打印輸出,這樣就完成就結(jié)構(gòu)體的基本創(chuàng)建,結(jié)尾不要忘了使用free(p):釋放申請的堆空間。