在c中存储unsigned char数组的数组

时间:2017-06-23 15:54:50

标签: c arrays pointers reference char

我在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数组的指针。

感谢所有帮助!

3 个答案:

答案 0 :(得分:0)

替换:

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]};

答案 1 :(得分:0)

这一行:

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]};

(注意&被删除了。)

data_a的类型为unsigned char[8](类似data_bdata_c)。因此&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*的数组时,类型不匹配。

答案 2 :(得分:0)

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

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

要创建指向字符数组的指针,您只需传递数组名称,该名称基本上也是指向数组第1个元素的指针。所以将代码更改为

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

这应该有效。 祝你好运。