我有一个 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);
因为函数参数列表中的数组声明被调整为指针类型,参见here和 here .
修复代码的最佳方法是使用结构:
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/