存储指向非指定大小数组的指针

时间:2017-11-13 20:34:47

标签: c arrays pointers

我有这样的功能:

void Menu_show(uint8_t count, char items[][UI_COLS + 1]);

其中 count 是数组 items 的第一个维度的长度。 我用这种方式调用这个函数:

#define MAX_SIZE 4
char items[MAX_SIZE ][UI_COLS + 1];

for (uint8_t i = 0; i < MAX_SIZE ; i++) sprintf(items[i], "%u", i);
...
Menu_show(MAX_SIZE, items);

它可以工作,但现在我需要在我的函数中存储一个指向数组第一个元素的指针。

我的想法:

  1. 第一个元素是items[0][0]
  2. 其指针为&items[0][0]
  3. 但现在我有一个指向char的指针,而不是一个二维数组
  4. 事实上,像printf(items[3])之类的东西不能以这种方式运作。 然后,我认为指向第二个(固定)维度的第一个元素的指针是&item[0]但是:

    char *_items[UI_COLS + 1];
    _items = &items[0];
    

    给出错误:

      

    赋值给数组类型

    的表达式

    我不理解在将第一个位置存储在指针中时保持二维数组用法的正确语法。

2 个答案:

答案 0 :(得分:2)

您定义_items的方式是char *的数组。您正试图分配给该数组(这本身就是非法的)指向数组的指针。

由于items的每个元素都是char [UI_COLS + 1]类型的数组,因此需要将其地址保存在指向数组的指针中:

char (*_items)[UI_COLS + 1] = &items[0];
printf("_items=%s\n", *_items);

答案 1 :(得分:0)

数组可以解释为指针 如果你有

arr[][]

arr可以考虑

&arr[0]

arr[i] 

可以视为

&arr[i][0]

二维数组实际上没有第一个元素,只是它的第一个元素数组[0]是该二维数组中的第一个数组。

printf(items[3]);

应该有效,因为

items[3] 

是一个char数组。

P.S。

出于安全原因,请使用

printf("%s",items[3]);

代替。