【问题标题】:storing array of unsigned char arrays in c在c中存储无符号字符数组的数组
【发布时间】:2017-11-27 06:40:10
【问题描述】:

我正在使用 C 语言处理一个 arduino 项目,我遇到以下情况:

我有 3 个不同大小的 char 数组,我想将每个数组的地址存储在第四个数组中。

我需要这些作为每个 char 数组的 地址,因为我想在后面的代码中修改 data_a、data_b 和 data_c,并且让 all_data 数组仍然指向修改后的数组。

unsigned char data_a[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
unsigned char data_b[3] = {0x08, 0x09, 0x0a};
unsigned char data_c[7] = {0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11};

int all_data_array_length = 3;

unsigned char* all_data[all_data_array_length] = {&data_a, &data_b, &data_c};

...

/*modify the data_a, data_b, data_c arrays */

...

for(int i = 0; i<all_data_array_length; i++) {
    /* do something with what all_data[i] points to /*
}

这导致:

cannot convert 'unsigned char (*)[8]' to 'unsigned char*'

我认为我感到困惑的地方是 char* 和 char[] 之间的区别,以及如何创建指向 char 数组的指针。

感谢所有帮助!

【问题讨论】:

  • 尝试删除 & 符号。

标签: c arrays pointers reference char


【解决方案1】:

char* 是指向字符或字符数组的指针,而 char[] 是数组。例如。 char* temp = "abc" ; 这里, 'temp' 是一个字符指针,指向 string 的第一个字符的内存位置,即 'a' 。 char temp[] = "abc" ; 这里,'temp' 是一个字符数组,保存所有内容的值,即 "abc" 。 来到你的代码,

unsigned char* all_data[all_data_array_length] = {&data_a, &data_b, &data_c}; 

要创建一个指向字符数组的指针,你需要做的就是传递数组名,它基本上也是一个指向数组第一个元素的指针。所以把你的代码改成

unsigned char* all_data[all_data_array_length] = {data_a, data_b, data_c};

这应该可行。 祝你好运。

【讨论】:

    【解决方案2】:

    这一行:

    unsigned char* all_data[all_data_array_length] = {&data_a, &data_b, &data_c};
    

    需要:

    unsigned char* all_data[all_data_array_length] = {data_a, data_b, data_c};
    

    unsigned char* all_data[all_data_array_length] = {&data_a[0], &data_b[0], &data_c[0]};
    

    (注意&amp; 已被删除)。

    data_aunsigned char[8] 类型(类似data_bdata_c)。因此,&amp;data_a 是一个指向 8 个无符号字符数组的指针:unsigned char (*)[8]。这是因为在 C 中的大多数上下文中,数组都会被转换为指向其第一个元素的指针。

    What is array decaying?When is an array name or a function name 'converted' into a pointer ? (in C)

    因此,当您尝试为它们分配 unsigned char* 的数组时,类型不匹配。

    【讨论】:

    • 感谢您的回复!
    【解决方案3】:

    替换:

    unsigned char* all_data[all_data_array_length] = {&data_a, &data_b, &data_c};
    

    与:

    unsigned char* all_data[3] = {&data_a[0], &data_b[0], &data_c[0]};
    

    【讨论】:

    • 啊,有道理!那么 &data_a[0] 是 data_a 的第一个元素的地址吗?在那种情况下,&data_a 是什么?
    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多