我有一个填充了一些数据的结构,并希望通过指定它来制作它的副本。
我有以下结构:
typedef struct items {
double cijena;
char sifra[100], naziv[100];
} ITEM, *ITEMcopy;
*ITEMcopy
应该是指向ITEM内容的指针(副本)。
在int main()
:
ITEM items[n];
ITEM *ITEMcopy = &items; // this is wrong
*ITEMcopy
应该用在我后来想要编辑内容的函数中:
void sort(ITEM **items, int n)
所以基本上,我不是直接编辑ITEM items[n]
内容,而是指定一个指向它所持有的数据的指针,然后编辑它。
产生错误的部分代码是ITEM *ITEMcopy = &items;
warning: initialization from incompatible pointer type
我希望我有点清楚。
当你写:
ITEM items[n];
你正在创建一个长度为ITEM
的n
s数组,数据的所有内存都在堆栈上分配。当你使用变量items
时,它现在引用数组items[0]
中的第一个元素,它类似于指针但是有一些关于它的长度的额外信息。
当你写:
ITEM *ITEMcopy;
你正在创建一个名为ITEMcopy
的指针,它可以包含ITEM
的位置,但是没有为任何ITEM
分配内存,ITEMcopy
只是用于指向已经存在的ITEM
如果你指定它:
ITEM *ITEMcopy = items;
ITEMcopy
指向ITEM
第一个items
的位置。所以ITEMcopy
现在是指向items
中第一个元素的指针。
当你写:
ITEM *ITEMcopy = &items;
这是警告,因为items
已经像一个指针。所以&items
是指向ITEM
的指针,该指针与ITEMcopy
不兼容,ITEM
需要指向sort
的指针
void sort(ITEM *items, int n)
函数看起来像这样:
ITEM items[n];
sort(items, n);
要使用sort函数:
void sort(ITEM *items, int n)
{
// could swap items[0] and items[1] like this
ITEM itemBuf;
memcpy(&itemBuf, &items[0], sizeof(ITEM));
memcpy(&items[0], &items[1], sizeof(ITEM));
memcpy(&items[1], &itemBuf, sizeof(ITEM));
}
在函数中使用变量:
qazxswpoi