生活随笔
收集整理的這篇文章主要介紹了
【☀️C语言函数传参の结构体数组篇☀️】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
背景介紹
C語言中函數參數傳遞的兩種方式(“引用傳遞做函數參數”是C++的特性,C語言不支持。)
(1)傳值,就是把你的變量的值傳遞給函數的形式參數,實際就是用變量的值來新生成一個形式參數,因而在函數里對形參的改變不會影響到函數外的變量的值。
(2)傳址,就是傳變量的地址賦給函數里形式參數的指針,使指針指向真實的變量的地址,因為對指針所指地址的內容的改變能反映到函數外,也就是能改變函數外的變量的值。一般有變量地址作為參數、數組名作為參數、指針作為參數。
數組名作為參數時,傳遞的是數組的首地址,實參數組和形參數組共用了一段內存空間。所以當用數組名做參數時,實參和形參共享了一個數組,形參數組的改變也就是實參數組的改變。指針作為參數和數組名作參數類似,傳遞的也是結構體數組的首地址,但是此時不是共享一個數組,而是共享一個變量的地址,也就是實參指針和形參指針共同指向同一個變量,共享同一個變量地址。
示例demo
下面的demo中:
test函數以結構體數組名為形參;
test1函數以結構體數組的首地址和數組大小作為形參;
test2函數是把結構體數組的首地址傳入,然后以數組的形式遍歷;
#include <stdio.h>
#include <string.h>#define MAXNUM (2)typedef struct tagNumber
{int i
;int j
;int k
;
}TNum
;typedef struct tagNumbers
{TNum atNum
[MAXNUM
];
}TNums
;
void test (TNums atNums1
[])
{printf("atNums1 ptr:%p\r\n",atNums1
);int idx
= 0; int idx1
= 0;for(idx
= 0; idx
< MAXNUM
; idx
++){for(idx1
= 0; idx1
< MAXNUM
; idx1
++){printf("i:%d\n",atNums1
[idx
].atNum
[idx1
].i
);printf("j:%d\n",atNums1
[idx
].atNum
[idx1
].j
);printf("k:%d\n",atNums1
[idx
].atNum
[idx1
].k
);}}
}
void test1(TNums
*ptNum
,int num
)
{printf("ptNum ptr:%p\r\n",ptNum
);int idx
= 0; int idx1
= 0;for(idx
= 0; idx
< num
; idx
++){for(idx1
= 0; idx1
< num
; idx1
++){printf("i:%d\n",(ptNum
+ idx
)->atNum
[idx1
].i
);printf("j:%d\n",(ptNum
+ idx
)->atNum
[idx1
].j
);printf("k:%d\n",(ptNum
+ idx
)->atNum
[idx1
].k
);}}
}
void test2(TNums
*ptNum
)
{printf("ptNum ptr:%p\r\n",ptNum
);int idx
= 0; int idx1
= 0;for(idx
= 0; idx
< MAXNUM
; idx
++){for(idx1
= 0; idx1
< MAXNUM
; idx1
++){printf("i:%d\n",ptNum
[idx
].atNum
[idx1
].i
);printf("j:%d\n",ptNum
[idx
].atNum
[idx1
].j
);printf("k:%d\n",ptNum
[idx
].atNum
[idx1
].k
);}}
}int main() {TNums atNums
[MAXNUM
];memset(atNums
, 0, sizeof(atNums
));int idx
= 0; int idx1
= 0;for(idx
= 0; idx
< MAXNUM
; idx
++){for(idx1
= 0; idx1
< MAXNUM
; idx1
++){atNums
[idx
].atNum
[idx1
].i
= 1+idx
;atNums
[idx
].atNum
[idx1
].j
= 2+idx
;atNums
[idx
].atNum
[idx1
].k
= 3+idx
;}}printf("atNums ptr:%p\r\n",atNums
);printf("func 1:\r\n");test(atNums
);printf("func 2:\r\n");test1(atNums
, MAXNUM
);printf("func 3:\r\n");test2(atNums
);return 0;
}
打印信息:
atNums ptr:0x7fff87dba270
func 1:
atNums1 ptr:0x7fff87dba270
i:1
j:2
k:3
i:1
j:2
k:3
i:2
j:3
k:4
i:2
j:3
k:4
func 2:
ptNum ptr:0x7fff87dba270
i:1
j:2
k:3
i:1
j:2
k:3
i:2
j:3
k:4
i:2
j:3
k:4
func 3:
ptNum ptr:0x7fff87dba270
i:1
j:2
k:3
i:1
j:2
k:3
i:2
j:3
k:4
i:2
j:3
k:4
引經據典
http://www.oh100.com/kaoshi/c/536660.html
總結
以上是生活随笔為你收集整理的【☀️C语言函数传参の结构体数组篇☀️】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。