我在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数组的指针。
感谢所有帮助!
答案 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_b
和data_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};
这应该有效。 祝你好运。