首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何有选择地将二维数组的列或行传递给函数?

如何有选择地将二维数组的列或行传递给函数?
EN

Stack Overflow用户
提问于 2018-10-03 01:58:21
回答 3查看 58关注 0票数 1

我有一个MAC地址数组(char 6),想要选择传递给函数的是哪一个,但对如何区分列和行感到有点困惑。我为一个示例程序想出了这个:

代码语言:javascript
复制
#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中打印mac2、mac3和mac-print,假设类型mac_t是必需的?

EN

回答 3

Stack Overflow用户

发布于 2018-10-03 02:44:30

您刚刚发现了其中的原因:

代码语言:javascript
复制
typedef unsigned char mac_t[6];

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

代码语言:javascript
复制
void mac_print(mac_t mac);

你觉得这是什么意思?它是一个接受mac_t类型的函数吗?不是真的,它转换为一个指针。

代码语言:javascript
复制
// 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

修复代码的最好方法是使用struct:

代码语言:javascript
复制
typedef struct {
    unsigned char v[6];
} mac_t;

现在您知道mac_t是什么了。您还将了解如何对其进行索引。你也可以很容易地做assignment mac_t a; mac_t b; a = b;和comparison !memcmp(&a, &b, sizeof(a)) ( memcmp需要一些训练,但是你可以习惯它)。

试试这个:

代码语言:javascript
复制
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]);
}
票数 2
EN

Stack Overflow用户

发布于 2018-10-03 02:42:02

应该是:

代码语言:javascript
复制
#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[0][1]=0x00;
    macs[0][2]=0x00;
    macs[0][3]=0x00;
    macs[0][4]=0x00;
    macs[0][5]=0x00;

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

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

    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[0],mac[1],mac[2],mac[3],mac[4],mac[5]);
}
票数 1
EN

Stack Overflow用户

发布于 2018-10-03 02:42:13

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

代码语言:javascript
复制
An array with three slots of arrays with six slots.

您当前的用法假设定义为:

代码语言:javascript
复制
An array with six slots of arrays with three slots.

因此,数组的维数实际上是3x6,而不是6x3(当前使用的)。

这个初始化器可能有助于建立一个更可靠的心理模型:

代码语言:javascript
复制
mac_t macs[3] = 
{
    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
    { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
    { 0x02, 0x02, 0x02, 0x02, 0x02, 0x02},
};

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52613856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档