我有以下代码
typedef struct{
int fildes;
char key[MAX_KEYLEN];
} item_t;
static int nitems;
static item_t *items;
FILE *filelist;
int capacity = 16;
char *path, *ptr;
if( NULL == (filelist = fopen(filename, "r"))){
fprintf(stderr, "Unable to open file in content_init.\n");
exit(EXIT_FAILURE);
}
items = (item_t*) malloc(capacity * sizeof(item_t));
nitems = 0;
while(fgets(items[nitems].key, MAX_KEYLEN, filelist)){
/*Taking out EOL character*/
items[nitems].key[strlen(items[nitems].key)-1] = '\0';
// and there's more code below which is not relevant to the question
在上面的代码中,
Item_t
是如下定义的结构
typedef struct{
int fildes;
char key[MAX_KEYLEN];
} item_t;
然后,items
被定义为
static item_t *items;
items
使用以下代码初始化
items = (item_t*) malloc(capacity * sizeof(item_t));
然后,对项目执行以下操作
fgets(items[nitems].key, MAX_KEYLEN, filelist)
项目应该是一个结构。它是如何变成数组的?我说数组是因为items[nitems]
正在完成
这让我觉得items是item_t结构的数组
答案 0 :(得分:3)
在大多数情况下,指针和数组可以互换使用。
array[i]
只是*(array+i)
的合成糖。
答案 1 :(得分:1)
回答您的问题“为什么指向结构的指针表现为结构数组?” (下面的答案适用于任何数据类型,无论它是结构还是其他数据类型)
当您使用'N'个元素初始化一个数组(任何数据类型)时,您只是在请求内存大小等于(N * sizeof(data-type))的内存数组中第一个元素的地址(即索引为零的元素)。
因此,当您访问数组中的任何元素时,您实际上所要做的就是取消引用存储在内存中特定地址的值。
示例:
#define N 3
int32_t array[N] = {11, 22, 33};
假设现在我要打印数组中的最后一个元素(即索引2处的元素)。 由于我知道数组的基地址,因此可以通过以下方式访问数组中的元素:
printf("%d \n", array[2]);
/***** OR *****/
printf("%d \n", *(array + 2));
注意:
从机器的角度来看,第二printf()
是怎么回事:
*(基地址+索引* sizeof(数据类型))
因为从机器的角度来看,数据类型,数组等概念不存在。 (简化的说明,而无需触及程序集级别的代码)
注意:
array[i]
只是*(array + i)