C語言結構體作為形參

Eoned發表於2020-10-04

今天碰到一個問題,程式需要修改結構體內成員的值
程式碼如下:

typedef struct
{
	int n;
}St;

void a(St L);

int main()
{
	St L;
	L.n=0;

	printf("%d\n",L.n);
	a(L);
	printf("%d",L.n);

	getchar();
	return 0;
}

void a(St L)
{
 	L.n=1;
}

程式宣告一個結構體變數,並在函式中修改成員的值,但並沒有生效,兩次輸出都為零。

問題應該出在函式的值傳遞與地址傳遞上,修改後如下:

typedef struct
{
	int n;
}St;

void a(St *L);

int main()
{
	St L;
	L.n=0;

	printf("%d\n",L.n);
	a(&L);
	printf("%d",L.n);

	getchar();
	return 0;
}

void a(St *L)
{
	(*L).n=1;
}

將函式形參和實參修改為按地址傳遞的方式就可以了

還有個小問題

(*L).n=1;

修改後的函式a內賦值必須加括號,點號的優先順序比乘號高,不加括號就會發生錯誤的賦值

*L.n=1;
意思是將L.n這個地址的值修改為1,但此處L.n並不是地址,傳入的形參L本就是一個結構體的地址,地址.n就更無從說起了。

(*L).n=1;
加括號後就變成了取L這個地址的值,也就是結構體,將其成員n的值修改為1.

相關文章