C語言中函數參數傳遞的兩種方式(“引用傳遞做函數參數”是C++的特性,C語言不支持。)
(1)傳值,就是把你的變量的值傳遞給函數的形式參數,實際就是用變量的值來新生成一個形式參數,因而在函數里對形參的改變不會影響到函數外的變量的值。
(2)傳址,就是傳變量的地址賦給函數里形式參數的指針,使指針指向真實的變量的地址,因為對指針所指地址的內容的改變能反映到函數外,也就是能改變函數外的變量的值。一般有變量地址作為參數、數組名作為參數、指針作為參數。
下面的demo中:
test函數以結構體數組名為形參;
test1函數以結構體數組的首地址和數組大小作為形參;
test2函數是把結構體數組的首地址傳入,然后以數組的形式遍歷;
#include #include #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.0void 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.1void 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:0x7fff87dba270func 1:atNums1 ptr:0x7fff87dba270i:1j:2k:3i:1j:2k:3i:2j:3k:4i:2j:3k:4func 2:ptNum ptr:0x7fff87dba270i:1j:2k:3i:1j:2k:3i:2j:3k:4i:2j:3k:4func 3:ptNum ptr:0x7fff87dba270i:1j:2k:3i:1j:2k:3i:2j:3k:4i:2j:3k:4
http://www.oh100.com/kaoshi/c/536660.html
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/118810.html
本章目錄 溫馨提示本章重點正文開始1. 操作符分類2.算數操作符2.1 `/`操作符2.2 `%`操作符 3. 位移操作符3.1 ``左移操作符 4. 位操作符4.1 `&`按位與操作符4.2 `|`按位或操作符4.3 `^`按位異或操作符 5. 賦值操作符6. 單目操作符6.1 各種單目操作符6.2 sizeof 和 數組 7. 關系操作符(后面的操作符不單獨出現在目錄中)8. ...
??C語言通訊錄管理系統(簡易版)?? ?一、通訊錄?二、菜單實現和用戶交互?三、主函數????1.enum選項????2.switch判斷 ?四、定義聯系人和通訊錄????1.定義聯系人結構體????2.定義通訊錄結構體????3.定義結構體變量 ?五、通訊錄初始化?六、新增聯系人?七、查找聯系人?八、刪除聯系人?九、修改聯系人?十、查看所有聯系人?十一、清空所有聯系人?十二、以名字排序所有...
目錄 一、什么是C語言? 二、第一個C語言程序 代碼 程序分析 ?程序運行 一個工程中出現兩個及以上的main函數 代碼 運行結果 分析 三、數據類型 數據各種類型 為什么會有這么多的數據類型? 計算機單位 ?各個數據類型的大小 ?注意事項 數據類型的使用 四、變量和常量 變量的分類 變量的使用 變量的作用域和生命周期 ?常量 五、字符串+轉義字符+注釋 字符串 ?轉義字符 注釋 六、選擇語句 ?...
摘要:我們以冒泡排序為例,模擬實現函數。交換每單位字節對于的二進制序列這樣,冒泡排序就能排序多種數據類型,模擬實現了函數,當然也可以使用其他的排序方法模擬實現函數。 ??...
閱讀 4693·2021-11-18 13:23
閱讀 896·2021-09-22 15:24
閱讀 1920·2021-09-06 15:00
閱讀 2619·2021-09-03 10:30
閱讀 1278·2021-09-02 15:15
閱讀 2056·2019-08-30 15:54
閱讀 3030·2019-08-30 15:44
閱讀 1449·2019-08-29 15:12