如何选择性地将2D数组的列或行传递给函数?

时间:2018-10-02 17:58:21

标签: c multidimensional-array pointer-arithmetic

我有一个MAC地址数组(字符[6]),想要选择我要传递给函数的那个​​,但是有点困惑如何区分列和行。 我想出了一个示例程序:

#include <stdio.h>

typedef unsigned char mac_t[6];

void mac_print(mac_t mac);

int main(void) {

    mac_t macs[3]={0};
    //mac1
    macs[0][0]=0x00;
    macs[1][0]=0x00;
    macs[2][0]=0x00;
    macs[3][0]=0x00;
    macs[4][0]=0x00;
    macs[5][0]=0x00;

    //mac2
    macs[0][1]=0x01;
    macs[1][1]=0x01;
    macs[2][1]=0x01;
    macs[3][1]=0x01;
    macs[4][1]=0x01;
    macs[5][1]=0x01;

    //mac3
    macs[0][2]=0x02;
    macs[1][2]=0x02;
    macs[2][2]=0x02;
    macs[3][2]=0x02;
    macs[4][2]=0x02;
    macs[5][2]=0x02;

    mac_print(*(macs));
    mac_print(*(macs+1));
    mac_print(*(macs+2));

}


void mac_print(mac_t mac) {
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
}

假设需要类型mac-print,如何在函数mac_t中打印mac1,mac2和mac3?

3 个答案:

答案 0 :(得分:2)

您刚刚发现了为什么:

typedef unsigned char mac_t[6];

不好。为什么?因为mac_t是一个数组。看这个:

void mac_print(mac_t mac);

您认为这意味着什么?它是一个使用mac_t类型的函数吗?并非如此,它转化为获取指针。

// all forms mean the same
void mac_print(mac_t mac);
void mac_print(unsigned char mac[6]);
void mac_print(unsigned char mac[]);
void mac_print(unsigned char *mac);

因为函数parameter-list中的数组声明被调整为指针类型,请参见herehere

修复代码的最佳方法是使用结构:

typedef struct {
    unsigned char v[6];
} mac_t;

现在您知道mac_t是什么了。您还将知道如何为其编制索引。您还可以轻松进行任务mac_t a; mac_t b; a = b;和比较!memcmp(&a, &b, sizeof(a))(memcmp需要一点训练,但是一个人可以习惯)。

尝试一下:

typedef struct {
    unsigned char v[6];
} mac_t;

void mac_print(mac_t mac);

int main(void) {

    mac_t macs[3]={0};
    //mac1
    macs[0].v[0]=0x00;
    macs[0].v[1]=0x00;
    macs[0].v[2]=0x00;
    macs[0].v[3]=0x00;
    macs[0].v[4]=0x00;
    macs[0].v[5]=0x00;

    //mac2
    macs[1].v[0]=0x01;
    macs[1].v[1]=0x01;
    macs[1].v[2]=0x01;
    macs[1].v[3]=0x01;
    macs[1].v[4]=0x01;
    macs[1].v[5]=0x01;

    //mac3
    macs[2].v[0]=0x02;
    macs[2].v[1]=0x02;
    macs[2].v[2]=0x02;
    macs[2].v[3]=0x02;
    macs[2].v[4]=0x02;
    macs[2].v[5]=0x02;

    // we pass by value here, but it would be better to pass a pointer
    // ie. `void mac_print(mac_t *mac);` and `mac_print(&macs[0]);`
    mac_print(macs[0]);
    mac_print(macs[1]);
    mac_print(macs[2]);

}


void mac_print(mac_t mac) {
        printf("%02x:%02x:%02x:%02x:%02x:%02x\n",mac.v[0],mac.v[1],mac.v[2],mac.v[3],mac.v[4],mac.v[5]);
}

答案 1 :(得分:1)

应该是:

    group By VotingValue 

答案 2 :(得分:0)

“ macs”变量在英语中的实际定义是:

An array with three slots of arrays with six slots.

您当前的用法假定为:

An array with six slots of arrays with three slots.

因此,数组的尺寸实际上是3 x 6,而不是6 x 3(当前使用)。

此初始值设定项可能有助于构建更可靠的思维模型:

mac_t macs[3] = 
{
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
    { 0x02, 0x02, 0x02, 0x02, 0x02, 0x02},
};

最后,printf语句需要做更多的工作,因为您当前正在引用数组的插槽(仅指定1个索引),而不是数组数组中的各个字节。