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

标签 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_t,如何在函数 mac-print 中打印 mac1、mac2 和 mac3?

最佳答案

你刚刚发现了为什么会这样:

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);

因为函数参数列表中的数组声明被调整为指针类型,参见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]);
}

关于c - 如何有选择地将二维数组的列或行传递给函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52613856/

相关文章:

c - 处理内核中未定义的指令

java - 从功能上遍历图像的惯用方式

c# 固定数组 - 从哪个结构读取最快?

c++ - 如何使用指针访问 char * 中的字符

c - 仅返回字中偶数位的函数

c - 使用 SIMD,我如何有条件地仅移动 alpha channel 值为 255 的像素?

c++ - 定义具有任意跨度的指针

c++ - 如果我知道只使用现有元素,我可以在数组开头之前传递一个指针吗?

调用带有 va_list 参数的函数需要在开始时使用 va_start() 吗?

python - 将列表作为 N 维 numpy 数组的切片传递