一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

二維數(shù)組作為函數(shù)參數(shù)傳遞在實(shí)際中的應(yīng)用

AGk5_ZLG_zhiyua ? 來(lái)源:未知 ? 作者:劉勇 ? 2017-12-20 07:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

周立功教授數(shù)年之心血之作《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》,電子版已無(wú)償性分享到電子工程師與高校群體,在公眾號(hào)回復(fù)【程序設(shè)計(jì)】即可在線閱讀。書本內(nèi)容公開后,在電子行業(yè)掀起一片學(xué)習(xí)熱潮。經(jīng)周立功教授授權(quán),本公眾號(hào)特對(duì)本書內(nèi)容進(jìn)行連載,愿共勉之。

第一章為程序設(shè)計(jì)基礎(chǔ),本文為1.7.3將二維數(shù)組作為函數(shù)參數(shù)。

>>>>1.7.3將二維數(shù)組作為函數(shù)參數(shù)

>>>1.函數(shù)原型

當(dāng)將數(shù)組的數(shù)組作為函數(shù)參數(shù)時(shí),數(shù)組名同樣視為地址,因此相應(yīng)的形參如同一維數(shù)組一樣也是一個(gè)指針,比較困難的是如何正確地聲明一個(gè)指針變量pData指向一個(gè)數(shù)組的數(shù)組data? 如果將pData聲明為指向int類型是不夠的,因?yàn)橹赶騣nt類型的指針變量只能與data[0]的類型匹配。假設(shè)有以下代碼:

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

int total = sum(data, 3);

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

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

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

當(dāng)然,也可以將這個(gè)函數(shù)原型寫成下面這樣的形式:

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

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

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

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

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

由于下標(biāo)是數(shù)組類型的一部分,如果第2個(gè)方括號(hào)是空的,則數(shù)組類型就不完整了,因?yàn)榫幾g器也不知道如何補(bǔ)全它。因此類似這樣的聲明:

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

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

是錯(cuò)誤的。

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

int data[80][3];

int total = sum(data, 20);

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

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

int iMax(int *pData, size_t numData)

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

largest = iMax(data, row*col);

則無(wú)法通過(guò)編譯,因?yàn)閐ata的類型為int (*)[col],而iMax函數(shù)期望的實(shí)參類型是int *。正確的調(diào)用形式如下:

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

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

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

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]是一個(gè)int值,因此&data[0][0]的類型為int *const。即可用以下方式指向data的第1個(gè)元素,增加指針的值使它指向下一個(gè)元素。即:

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

int *ptr = data[0];

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

int working_time[12][31];

在這里,如果開發(fā)一個(gè)根據(jù)一個(gè)月的工作時(shí)間計(jì)算工資的函數(shù),可以象下面這樣將某月的工作時(shí)間傳遞給這個(gè)函數(shù):

calc_salary(working_time[month]);

其相應(yīng)的函數(shù)原型如下:

int calc_salary(int *working_time);

這種技巧只有通過(guò)“數(shù)組的數(shù)組”才能實(shí)現(xiàn),而多維數(shù)組則顯得蒼白無(wú)力。

>>>2.二維數(shù)組的行

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

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

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 }

當(dāng)使用指向數(shù)組的指針對(duì)data進(jìn)行初始化時(shí):

int (*pData)[2] = data;

它使pData指向data的第一行,當(dāng)pData與一個(gè)整數(shù)相加時(shí),該整數(shù)值首先根據(jù)2個(gè)整數(shù)值的長(zhǎng)度進(jìn)行調(diào)整,然后再執(zhí)行加法,因此可以使用這個(gè)指針一行一行地在data中移動(dòng)。

對(duì)于每個(gè)row值,內(nèi)部的for循環(huán)將遍歷所有的col值。如果將二維數(shù)組當(dāng)作一維數(shù)組來(lái)看,則上述的雙重循環(huán)可以改為單循環(huán)。比如,將二維數(shù)組的所有元素初始化為0:

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

*ptr = 0;

當(dāng)循環(huán)開始時(shí),ptr指向data[0][0],ptr++使ptr指向data[0][1]、data[0][2]……當(dāng)ptr到達(dá)data[0][col-1](即第0行的最后一個(gè)元素)時(shí),再次對(duì)ptr自增使它指向data[1][0],持續(xù)這一過(guò)程直到ptr越過(guò)data[row-1][col-1](數(shù)組中的最后一個(gè)元素)為止。

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

ptr = &data[i][0];

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

ptr = data[i];

下面的循環(huán)是對(duì)數(shù)組data的第i行清0,其中用到了這一簡(jiǎn)化。即:

int data[row][col];

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

*pData = 0;

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

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

>>>3.二維數(shù)組的列

由于數(shù)組是按行而不是按列存儲(chǔ)的,因此處理二維數(shù)組的一列中的元素相對(duì)來(lái)說(shuō)就復(fù)雜一些。下面的循環(huán)是對(duì)數(shù)組data第i列清0:

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

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

(*pData)[i] = 0;

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

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


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5152

    文章

    19675

    瀏覽量

    317606
  • 周立功
    +關(guān)注

    關(guān)注

    38

    文章

    130

    瀏覽量

    38217
  • 數(shù)組
    +關(guān)注

    關(guān)注

    1

    文章

    420

    瀏覽量

    26551

原文標(biāo)題:周立功:如何將二維數(shù)組作為函數(shù)參數(shù)傳遞

文章出處:【微信號(hào):ZLG_zhiyuan,微信公眾號(hào):ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問(wèn)LabView如何直接發(fā)送二維數(shù)組到DMD上顯示?

    函數(shù),2 該函數(shù)似乎只能輸入一個(gè)數(shù)字,不知道具體該怎么用。想要達(dá)到目的是,Labview中生成一個(gè)0和1組成的二維
    發(fā)表于 02-27 07:30

    C語(yǔ)言二維數(shù)組的定義和引用

    ], a[2][3]二維數(shù)組概念上是二維的,即是說(shuō)其下標(biāo)兩個(gè)方向上變化,下標(biāo)變量在數(shù)組
    發(fā)表于 07-12 08:55

    LABVIEW怎么將二維數(shù)組轉(zhuǎn)化為一數(shù)組

    `LABVIEW怎么將二維數(shù)組轉(zhuǎn)化為一數(shù)組并且如何將數(shù)據(jù)顯示到波形圖中... 并且如何將數(shù)
    發(fā)表于 02-14 16:56

    二維數(shù)組冒泡排序

    Labview對(duì)于一數(shù)組可以直接排序,但如果是二維數(shù)組時(shí),特別是字符串類型二維
    發(fā)表于 09-30 16:06

    ???LabVIEW DLL傳遞一個(gè)二維數(shù)組報(bào)錯(cuò)

    DLL,其參數(shù)包含一個(gè)2數(shù)組。 注意:在其他應(yīng)用(比如Matlab?)當(dāng)需要為L(zhǎng)abVIEW DLL傳遞一個(gè)
    發(fā)表于 02-19 20:44

    c語(yǔ)言二維數(shù)組定義及其規(guī)則詳解

    數(shù)組只有一個(gè)下標(biāo),,稱為一數(shù)組,其數(shù)組元素也稱為單下標(biāo)變量。
    發(fā)表于 11-16 08:49 ?2.2w次閱讀
    c語(yǔ)言<b class='flag-5'>二維</b><b class='flag-5'>數(shù)組</b>定義及其規(guī)則詳解

    c語(yǔ)言二維數(shù)組初始化及使用

    二維數(shù)組初始化也是類型說(shuō)明時(shí)給各下標(biāo)變量賦以初值。二維數(shù)組可按行分段賦值,也可按行連續(xù)賦值。 數(shù)組
    發(fā)表于 11-16 09:15 ?2w次閱讀
    c語(yǔ)言<b class='flag-5'>二維</b><b class='flag-5'>數(shù)組</b>初始化及使用

    二維數(shù)組重新排序

    labview進(jìn)行二維數(shù)組的重新排序
    發(fā)表于 12-12 15:15 ?10次下載

    函數(shù)參數(shù)傳遞的原理

    參數(shù)傳遞,是程序運(yùn)行過(guò)程,實(shí)際參數(shù)就會(huì)將參數(shù)
    的頭像 發(fā)表于 03-02 11:41 ?7651次閱讀
    <b class='flag-5'>函數(shù)</b><b class='flag-5'>參數(shù)</b><b class='flag-5'>傳遞</b>的原理

    C語(yǔ)言程序設(shè)計(jì)教程之二維數(shù)組如何應(yīng)用二維數(shù)組的資料概述

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語(yǔ)言程序設(shè)計(jì)教程之二維數(shù)組如何應(yīng)用二維數(shù)組的資料概述主要內(nèi)容包括了:1 了解二維
    發(fā)表于 10-26 16:48 ?3次下載

    二維數(shù)組數(shù)組指針以及指針數(shù)組

    二維數(shù)組數(shù)組指針以及指針數(shù)組
    的頭像 發(fā)表于 08-16 09:02 ?3174次閱讀

    Python將二維數(shù)組輸出為圖片

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

    python怎么創(chuàng)建二維數(shù)組

    如何創(chuàng)建二維數(shù)組Python是一個(gè)常見的問(wèn)題。Python,我們可以使用嵌套的列表(li
    的頭像 發(fā)表于 11-21 15:10 ?4540次閱讀

    python如何定義二維數(shù)組

    Python,可以通過(guò)使用列表嵌套的方式來(lái)定義二維數(shù)組。具體步驟如下: Step 1: 創(chuàng)建一個(gè)空的二維列表 要?jiǎng)?chuàng)建一個(gè)空的
    的頭像 發(fā)表于 11-21 15:12 ?2324次閱讀

    將一數(shù)組轉(zhuǎn)為二維python

    將一數(shù)組轉(zhuǎn)為二維數(shù)組是一個(gè)常見的問(wèn)題,特別是處理數(shù)據(jù)時(shí)。一
    的頭像 發(fā)表于 11-23 14:54 ?5993次閱讀