色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

跟周立功學C語言編程:如何將二維數組作為函數參數傳遞?這三要素要時刻謹記!

AGk5_ZLG_zhiyua ? 來源:未知 ? 作者:電子大兵 ? 2017-09-06 09:54 ? 次閱讀

第一章為程序設計基礎,本文為1.7.3將二維數組作為函數參數。

>>>>1.7.3將二維數組作為函數參數

>>>1.函數原型

當將數組的數組作為函數參數時,數組名同樣視為地址,因此相應的形參如同一維數組一樣也是一個指針,比較困難的是如何正確地聲明一個指針變量pData指向一個數組的數組data? 如果將pData聲明為指向int類型是不夠的,因為指向int類型的指針變量只能與data[0]的類型匹配。假設有以下代碼:

int data[3][2] = {{1, 2}, {3, 4}, {5, 6}};

int total = sum(data, 3);

那么sum()函數的原型是什么?

由于表達式中的數組名data可以被解釋為指針,即data的類型為指向int [2]的指針類型int (*)[2],因此必須將pData聲明為與之匹配的類型,data才能作為實參傳遞給sum()。其函數原型如下:

int sum(int (*pDdata)[2], int size);

當然,也可以將這個函數原型寫成下面這樣的形式:

int sum(int data[3][2], int size);

還有一種格式,這種格式與上述原型的含義完全相同,但可讀性更強。在聲明一個接收二維數組為參數的函數時,只要提供第二個即可:

int sum(int data[][2], int size);

其中,data[]表達式是數組指針的一種隱式聲明,(*pData)表達式則是指針的一種顯式聲明。雖然data是“由2個int值組成的數組(元素個數未知)”,但它同樣可以被解釋為“指向int [2]的指針”。即:

int sum(int (*pData)[2], int size);

由于下標是數組類型的一部分,如果第2個方括號是空的,則數組類型就不完整了,因為編譯器也不知道如何補全它。因此類似這樣的聲明:

int sum(int data[3][], int size);

int sum(int data[][], int size);

是錯誤的。

sun()函數為何將行數(3)作為參數,而不是將列(2)作為參數呢?上述原型都指出,data是指針不是數組。由于data是由2個int值組成的數組,因此也就意味著在聲明時指定了列數,這就是為什么沒有將列數作為獨立的函數參數進行傳遞的原因。比如:

int data[80][3];

int total = sum(data, 20);

int total = sum(data+5, 10);

當然,也可以讓函數將二維數組看成一維數組,比如,如何找到二維數組中的最大元素。其函數原型(iMax.h文件)如下:

int iMax(int *pData, size_t numData)

如果將數組的地址data作為iMax()函數的第1個實參,數組data中的元素總數量row*col作為第2個實參:

largest = iMax(data, row*col);

則無法通過編譯,因為data的類型為int (*)[col],而iMax函數期望的實參類型是int *。正確的調用形式如下:

largest = iMax(data[0], row*col);

其中的data[0]指向第0行的元素0,經過編譯器轉換后,其類型為int *,實參與形參類型一致。當將data強制轉換為(int *)data時,同樣也可以求二維數組中元素的最大值,詳見程序清單 1.33。

程序清單1.33求二維數組中元素的最大值范例程序

1 #include

2 #include "iMax.h"

3

4 int main(int argc, char *argv[])

5 {

6 int data[][2] = {{1, 2}, {3, 4}, {5, 6}};

7 int n = sizeof(data) / sizeof(data[0][0]);

8 printf("%d\n", iMax((int *)data, n));

9 return 0;

10 }

由于data[0][0]是一個int值,因此&data[0][0]的類型為int *const。即可用以下方式指向data的第1個元素,增加指針的值使它指向下一個元素。即:

int *ptr = &data[0][0];

int *ptr = data[0];

如果將某人一年之中的工作時間,使用下面這個“數組的數組”表示:

int working_time[12][31];

在這里,如果開發一個根據一個月的工作時間計算工資的函數,可以象下面這樣將某月的工作時間傳遞給這個函數:

calc_salary(working_time[month]);

其相應的函數原型如下:

int calc_salary(int *working_time);

這種技巧只有通過“數組的數組”才能實現,而多維數組則顯得蒼白無力。

>>>2.二維數組的行

由于C語言是按行主序存儲二維數組的,即先存儲0行的元素,接著存儲1行的元素,依此類推。因此要訪問數組中的每一個元素,可以從data[0][0]開始,用一個for循環改變行,用另一個for循環改變列,詳見程序清單 1.34。

程序清單1.34求二維數組中元素的和范例程序

1 int sum(int (*pData)[2], int size)

2 {

3 int total = 0;

4

5 for(int row = 0; row < size; row++)?

6 for(int col = 0; col < 2; col++)

7 total += pData[row][col];

8 return total;

9 }

當使用指向數組的指針對data進行初始化時:

int (*pData)[2] = data;

它使pData指向data的第一行,當pData與一個整數相加時,該整數值首先根據2個整數值的長度進行調整,然后再執行加法,因此可以使用這個指針一行一行地在data中移動。

對于每個row值,內部的for循環將遍歷所有的col值。如果將二維數組當作一維數組來看,則上述的雙重循環可以改為單循環。比如,將二維數組的所有元素初始化為0:

for(int *ptr = &data[0][0]; ptr <= &data[row - 1][col - 1]; ptr++)?

*ptr = 0;

當循環開始時,ptr指向data[0][0],ptr++使ptr指向data[0][1]、data[0][2]……當ptr到達data[0][col-1](即第0行的最后一個元素)時,再次對ptr自增使它指向data[1][0],持續這一過程直到ptr越過data[row-1][col-1](數組中的最后一個元素)為止。

如何處理二維數組一行中的元素?如果需要一個指針逐個訪問數組的元素,而不是逐行在數組中移動,再次選擇使用指針變量ptr。為了訪問第i行的元素,需要初始化ptr使其指向數組data中第i行的元素0。即:

ptr = &data[i][0];

由于data[i]等價于*(data + i),因此&data[i][0]等同于&(*(data[i]+0)),即等價于&*data[i]。又由于&與*運算符可以抵消,因此等同于data[i],即可將“ptr = &data[i][0];”簡寫為:

ptr = data[i];

下面的循環是對數組data的第i行清0,其中用到了這一簡化。即:

int data[row][col];

for(ptr = data[i]; ptr < data[i] + col; ptr++)?

*pData = 0;

因為data[i]是指向數組data第i行的指針,所以將data[i]傳遞給需要用一維數組作為實參的函數,即使用一維數組的函數也可以使用二維數組中的一行。顯然找到一維數組中最大元素的iMax函數,同樣也可以用于確定二維數組data中第i行的最大元素:

largest = iMax(data[i], col);

>>>3.二維數組的列

由于數組是按行而不是按列存儲的,因此處理二維數組的一列中的元素相對來說就復雜一些。下面的循環是對數組data第i列清0:

int data[row][col], (*pData)[col], i;

for(pData = &data[0]; pData < &data[row]; pData++)

(*pData)[i] = 0;

在這里,將pData聲明為指向長度為col的整型數組的指針,pData++將pData移到下一行的開始位置。在表達式(*pData)[i]中,*pData代表data的一整行,因此(*pData)[i]選中了該行第i列的那個元素。注意,*pData必須使用括號,否則編譯器會認為pData是指針數組,而不是指向數組的指針。

由此可見,只要抓住“變量的三要素(即變量的類型、變量的值和變量的地址)”并貫穿始終,則一切問題將迎刃而解。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言編程
    +關注

    關注

    6

    文章

    90

    瀏覽量

    21108
  • 周立功
    +關注

    關注

    38

    文章

    130

    瀏覽量

    37658
  • 數組
    +關注

    關注

    1

    文章

    417

    瀏覽量

    25963

原文標題:周立功:如何將二維數組作為函數參數傳遞

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    所有C語言數組和指針的知識都在這里了!|立功手把手教你C語言編程

    數組作為函數參數時,C語言函數的所有
    的頭像 發表于 09-01 09:28 ?8247次閱讀

    如何將兩個一數組合并為二維數組

    如題,本人初學,希望會的網友幫助解答一下!!!還有如何將一個二維數組拆分為兩個一數組!!!
    發表于 10-31 19:59

    如何將二維數組轉換為圖像

    如何將二維數組轉換為圖像
    發表于 03-10 11:15

    C語言二維數組的定義和引用

    今天用二維數組時不知道怎么用了,網上查了下,摘到這里來了。一數組只有一個下標,稱為一數組,其
    發表于 07-12 08:55

    在LABVIEW中怎么二維數組轉化為一數組

    `在LABVIEW中怎么二維數組轉化為一數組并且如何將數據顯示到波形圖中... 并且
    發表于 02-14 16:56

    ???LabVIEW DLL傳遞一個二維數組報錯

    ???LabVIEW DLL傳遞一個二維數組報錯當調用一個LabVIEW DLL時,首先需要聲明處理程序變量并將其初始化為NULL,比如,在C中,代碼如下所示: main
    發表于 02-19 20:44

    C語言教程之使用二維數組保存數據問題

    C語言教程之使用二維數組保存數據問題,很好的C語言資料,快來學習吧。
    發表于 04-25 15:03 ?0次下載

    C語言教程之求二維數組對角線之和

    C語言教程之求二維數組對角線之和,很好的C語言資料,快來學習吧。
    發表于 04-25 15:21 ?0次下載

    c語言二維數組定義及其規則詳解

    數組只有一個下標,,稱為一數組,其數組元素也稱為單下標變量。在實際問題中有很多量是二維的或
    發表于 11-16 08:49 ?2.2w次閱讀
    <b class='flag-5'>c</b><b class='flag-5'>語言</b><b class='flag-5'>二維</b><b class='flag-5'>數組</b>定義及其規則詳解

    c語言二維數組初始化及使用

    ,就組成了二維數組。當然,前提是各元素類型必須相同。根據這樣的分析,一個二維數組也可以分解為多個一數組
    發表于 11-16 09:15 ?2w次閱讀
    <b class='flag-5'>c</b><b class='flag-5'>語言</b><b class='flag-5'>二維</b><b class='flag-5'>數組</b>初始化及使用

    C語言程序設計教程之二維數組如何應用二維數組的資料概述

    本文檔的主要內容詳細介紹的是C語言程序設計教程之二維數組如何應用二維數組的資料概述主要內容包括了
    發表于 10-26 16:48 ?3次下載

    Python二維數組輸出為圖片

    使用Python讀取二維數組二維數組輸出為圖片,并保存在本地。
    的頭像 發表于 01-11 16:18 ?1413次閱讀
    Python<b class='flag-5'>將</b><b class='flag-5'>二維</b><b class='flag-5'>數組</b>輸出為圖片

    C語言函數參數介紹

    C語言數組元素作函數實參 數組元素可以用作函數實參,不能用作形參。
    的頭像 發表于 03-10 14:30 ?2409次閱讀

    C語言二維數組介紹

    定義一個兩行列的二維數組,總共有6個元素
    的頭像 發表于 09-11 14:51 ?916次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>—<b class='flag-5'>二維</b><b class='flag-5'>數組</b>介紹

    數組轉為二維python

    數組轉為二維數組是一個常見的問題,特別是在處理數據時。一
    的頭像 發表于 11-23 14:54 ?5477次閱讀
    主站蜘蛛池模板: 重口味av| 亚洲专区中文字幕视频专区| 国产麻豆AV伦| 亚洲视频欧美在线专区| 捏揉舔水插按摩师| 精品少妇高潮蜜臀涩涩AV| 成人在线视频免费观看| 最新国产在线视频在线| 亚洲色噜噜狠狠网站| 国产成人免费观看在线视频| www红色一片| 成 人 网 站免费观看| 白人大战34厘米黑人BD| ASIAN大陆明星裸休合成PICS| 98久久人妻无码精品系列蜜桃| 伦理在线影院伦理电影| 国产不卡在线观看视频| 成人 迅雷下载| 俄罗斯XBXBXB兽交| 囯产少妇BBBBBB高潮喷水一| 国产成人无码精品久久久按摩 | 最近日本MV字幕免费观看在线| 精品网站一区二区三区网站 | 久草在线草a免费线看| 国产免费人成在线视频有码| 俄罗斯6一9泑女网站| jj插入bb| qvod电影资源| ae58老司机福利| 99视频国产热精品视频| 18禁无遮挡羞羞污污污污免费| 一本色道久久综合亚洲精品蜜桃冫 | 浪潮AV色综合久久天堂| 精品无码国产污污污免费网站2 | 久久99视热频国只有精品| 国产专区_爽死777| 国产亚洲精品久久久久久入口| 国产精品乱人无码伦AV在线A| 成人国产三级在线播放| 菲律宾毛片| 高清国产免费观看视频在线|