首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结构通过指针数组引用。

问结构通过指针数组引用。
EN

Stack Overflow用户
提问于 2021-01-21 22:29:58
回答 1查看 49关注 0票数 1

我正在尝试设置指向结构的指针数组。我尝试过两种方法,这两种方法都给了我编译错误。下面是代码示例。

如能提供任何协助,将不胜感激。

在第一个示例中,我得到了一个编译警告

代码语言:javascript
复制
struct stPlanets *pPlanets = &planets;

警告是:

警告:从不兼容的指针类型‘struct stPlanets ()5’初始化‘struct stPlanets’-warning兼容-指针类型结构stPlanets *pPlanets =和行星;

示例01。

代码语言:javascript
复制
#include <stdio.h>

int main(void)
{
    struct stPlanets {
        char    *planet;
        char    *deity[10];
    };  

    struct stPlanets planets[] = { 
        {"Mercury", {"Messenger"}},
        {"Venus", {"Love, Beauty"}},
        {"Earth", {"Earthly things"}},
        {"Mars", {"War"}},
        {"Jupiter", {"Sky, Thunder, King of gods"}}
    };  

    struct stPlanets *pPlanets = &planets;

    int     i = 0;
    int     sPlanets = sizeof(planets) / sizeof(struct stPlanets);

    printf("There are %d planets.\n", sPlanets);

    for (i = 0; i < sPlanets; i++)
    {   
        printf("%-10s : %s.\n", planets[i].planet, planets[i].deity[0]);
    }   

    return 0;
}

示例02。

代码语言:javascript
复制
#include <stdio.h>

int main(void)
{
    struct stPlanets {
        char    *planet;
        char    *deity[10];
    };  

    struct stPlanets *planets[] = { 
        {"Mercury", {"Messenger"}},
        {"Venus", {"Love, Beauty"}},
        {"Earth", {"Earthly things"}},
        {"Mars", {"War"}},
        {"Jupiter", {"Sky, Thunder, King of gods"}}
    };  

    int     i = 0;
    int     sPlanets = sizeof(planets) / sizeof(struct stPlanets);

    printf("There are %d planets.\n", sPlanets);

    for (i = 0; i < sPlanets; i++)
    {   
        printf("%-10s : %s.\n", planets[i]->planet, planets[i]->deity[0]); //abbreviated to just print first instance.
    }   

    return 0;
}

在第二个示例中,我得到以下内容:

代码语言:javascript
复制
planets-06a.c:11:9: warning: braces around scalar initializer
         {"Mercury", {"Messenger"}},
         ^
planets-06a.c:11:9: note: (near initialization for ‘planets[0]’)
planets-06a.c:11:10: warning: initialization of ‘struct stPlanets *’ from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
         {"Mercury", {"Messenger"}},
          ^~~~~~~~~
planets-06a.c:11:10: note: (near initialization for ‘planets[0]’)
planets-06a.c:11:9: warning: braces around scalar initializer
         {"Mercury", {"Messenger"}},
EN

回答 1

Stack Overflow用户

发布于 2021-01-21 22:34:11

在第一个代码片段中,您必须编写

代码语言:javascript
复制
struct stPlanets *pPlanets = planets;

而不是

代码语言:javascript
复制
struct stPlanets *pPlanets = &planets;

或者你可以写

代码语言:javascript
复制
struct stPlanets ( *pPlanets )[5] = &planets;

也就是说,用作初始化器的数组指示符被隐式转换为指向其第一个元素的指针。

所以在这份声明中

代码语言:javascript
复制
struct stPlanets *pPlanets = planets;

声明的对象和初始化器(在隐式转换之后)具有相同的struct stPlanets *类型。

在本声明中

代码语言:javascript
复制
struct stPlanets *pPlanets = &planets;

初始化程序的类型为struct stPlanets ( * )[5]。因此,编译器发出消息,声明的对象和初始化程序具有不兼容的类型。

在第二个代码片段中,这个声明

代码语言:javascript
复制
struct stPlanets *planets[] = { 
    {"Mercury", {"Messenger"}},
    {"Venus", {"Love, Beauty"}},
    {"Earth", {"Earthly things"}},
    {"Mars", {"War"}},
    {"Jupiter", {"Sky, Thunder, King of gods"}}
};

不正确,因为首先需要定义将由指针数组的元素指向的结构对象。

这是你最新的程序。

代码语言:javascript
复制
#include <stdio.h>

int main(void)
{
    struct stPlanets {
        char    *planet;
        char    *deity[10];
    };  

    struct stPlanets planets[] = { 
        {"Mercury", {"Messenger"}},
        {"Venus", {"Love, Beauty"}},
        {"Earth", {"Earthly things"}},
        {"Mars", {"War"}},
        {"Jupiter", {"Sky, Thunder, King of gods"}}
    };  

    struct stPlanets *pPlanets = planets;

    size_t     sPlanets = sizeof(planets) / sizeof( *planets );

    printf("There are %zu planets.\n", sPlanets);

    for ( size_t i = 0; i < sPlanets; i++ )
    {   
        printf("%-10s : %s.\n", pPlanets[i].planet, pPlanets[i].deity[0]);
    }   

    return 0;
}

其输出是

代码语言:javascript
复制
Mercury    : Messenger.
Venus      : Love, Beauty.
Earth      : Earthly things.
Mars       : War.
Jupiter    : Sky, Thunder, King of gods.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65836728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档