日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【☀️C语言函数传参の结构体数组篇☀️】

發布時間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【☀️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);}} }//結構體指針1.0 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);}} }//結構體指針1.1 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语言函数传参の结构体数组篇☀️】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。