生活随笔
收集整理的這篇文章主要介紹了
【☀️C语言函数传参の结构体数组篇☀️】
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
背景介紹
C語言中函數(shù)參數(shù)傳遞的兩種方式(“引用傳遞做函數(shù)參數(shù)”是C++的特性,C語言不支持。)
(1)傳值,就是把你的變量的值傳遞給函數(shù)的形式參數(shù),實(shí)際就是用變量的值來新生成一個(gè)形式參數(shù),因而在函數(shù)里對(duì)形參的改變不會(huì)影響到函數(shù)外的變量的值。
(2)傳址,就是傳變量的地址賦給函數(shù)里形式參數(shù)的指針,使指針指向真實(shí)的變量的地址,因?yàn)閷?duì)指針?biāo)傅刂返膬?nèi)容的改變能反映到函數(shù)外,也就是能改變函數(shù)外的變量的值。一般有變量地址作為參數(shù)、數(shù)組名作為參數(shù)、指針作為參數(shù)。
數(shù)組名作為參數(shù)時(shí),傳遞的是數(shù)組的首地址,實(shí)參數(shù)組和形參數(shù)組共用了一段內(nèi)存空間。所以當(dāng)用數(shù)組名做參數(shù)時(shí),實(shí)參和形參共享了一個(gè)數(shù)組,形參數(shù)組的改變也就是實(shí)參數(shù)組的改變。指針作為參數(shù)和數(shù)組名作參數(shù)類似,傳遞的也是結(jié)構(gòu)體數(shù)組的首地址,但是此時(shí)不是共享一個(gè)數(shù)組,而是共享一個(gè)變量的地址,也就是實(shí)參指針和形參指針共同指向同一個(gè)變量,共享同一個(gè)變量地址。
示例demo
下面的demo中:
test函數(shù)以結(jié)構(gòu)體數(shù)組名為形參;
test1函數(shù)以結(jié)構(gòu)體數(shù)組的首地址和數(shù)組大小作為形參;
test2函數(shù)是把結(jié)構(gòu)體數(shù)組的首地址傳入,然后以數(shù)組的形式遍歷;
#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
引經(jīng)據(jù)典
http://www.oh100.com/kaoshi/c/536660.html
總結(jié)
以上是生活随笔為你收集整理的【☀️C语言函数传参の结构体数组篇☀️】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。