在 C 中使用带指针的结构和数组

Using structures with pointers in C with an array

我有以下代码会产生一条警告 "warning: initialization makes pointer from integer without a cast"。

如果我将数据类型 *eleNum 更改为 char,那么它可以干净地编译。我做错了什么导致编译抱怨 *eleNum 是一个整数?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct ptElements {
    int  *eleNum;
    char *eleSym;
    char *eleNme;
    char *elePrd;
    char *eleGrp;
} Elements;

Elements database[] = { 
    { 1, "H",  "Hydrogen", "1", "1"  },  
    { 2, "He", "Helium",   "1", "18" },
    { 3, "Li", "Lithium",  "2", "1" },
    { 4, "Be", "Berylium", "2", "2" },
    { 5, "B",  "Boron",    "2", "13" }
};

int main() {
    int     i;  
    int     limit;

    limit = sizeof(database) / sizeof(Elements);

    for (i = 0; i < limit; i++)
        printf("%3s - %-3s %-20s %2s %2s\n", database[i].eleNum, database[i].eleSym, database[i].eleNme, database[i].elePrd, database[i].eleGrp);

    return 0;
}

struct-point-02.c:14:7: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
     { 1, "H",  "Hydrogen", "1", "1"  },
       ^
struct-point-02.c:14:7: note: (near initialization for ‘database[0].eleNum’)
struct-point-02.c:15:7: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
     { 2, "He", "Helium",   "1", "18" },
       ^
struct-point-02.c:15:7: note: (near initialization for ‘database[1].eleNum’)
struct-point-02.c:16:7: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
     { 3, "Li", "Lithium",  "2", "1" },
       ^
struct-point-02.c:16:7: note: (near initialization for ‘database[2].eleNum’)
struct-point-02.c:17:7: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
     { 4, "Be", "Berylium", "2", "2" },
       ^
struct-point-02.c:17:7: note: (near initialization for ‘database[3].eleNum’)
struct-point-02.c:18:7: warning: initialization makes pointer from integer without a cast [-Wint-conversion]
     { 5, "B",  "Boron",    "2", "13" }
       ^
struct-point-02.c:18:7: note: (near initialization for ‘database[4].eleNum’)

主要回答

要么在结构中使用 int eleNum,要么使用 char *eleNum 并更改初始值设定项以使用 "1" 用于氢。

您当前使用 %s 打印 eleNum — 这是完全错误的(将整数指针打印为字符指针)。如果 eleNum 变为 int,则使用 %3d;如果它变成 char *.

,则使用 %3s

如果它仍然是 int *,您需要提供类似 (int []){ 1 }(C99 或更高版本的复合文字)的内容作为初始值设定项,以及 *database[i].eleNumdatabase[i].eleNum[0]printf() 语句中打印它,并使用 %3d.

#include <stdio.h>

typedef struct ptElements
{
    int   eleNum;
    char *eleSym;
    char *eleNme;
    char *elePrd;
    char *eleGrp;
} Elements;

Elements database[] =
{ 
    { 1, "H",  "Hydrogen", "1",  "1" },  
    { 2, "He", "Helium",   "1", "18" },
    { 3, "Li", "Lithium",  "2",  "1" },
    { 4, "Be", "Berylium", "2",  "2" },
    { 5, "B",  "Boron",    "2", "13" }
};

int main(void)
{
    int limit = sizeof(database) / sizeof(Elements);

    for (int i = 0; i < limit; i++)
    {
        printf("%3d - %-3s %-20s %2s %2s\n", database[i].eleNum,
               database[i].eleSym, database[i].eleNme, database[i].elePrd,
               database[i].eleGrp);
    }
    return 0;
}

有关周期性的切向信息Table

我注意到现在所有的元素都有一个字母或两个字母的符号;像 Uub 这样的 3 个字母的符号现在已经全部替换为 'real' 名称。 (参见 WebElements as one source of information — there are undoubtedly many others, such as Wikipedia Periodic Table of Elements。)

早在 2010 年,我有一个 SQL table 个带有条目的元素(N 表示 'not stable' 或 'radioactive'):

INSERT INTO elements VALUES(112, 'Uub', 'Ununbium',      277.0000, 'N');
INSERT INTO elements VALUES(113, 'Uut', 'Ununtrium',     284.0000, 'N');
INSERT INTO elements VALUES(114, 'Uuq', 'Ununquadium',   289.0000, 'N');
INSERT INTO elements VALUES(115, 'Uup', 'Ununpentium',   288.0000, 'N');
INSERT INTO elements VALUES(116, 'Uuh', 'Ununhexium',    293.0000, 'N');
INSERT INTO elements VALUES(118, 'Uuo', 'Ununoctium',    294.0000, 'N');

它们的名字是在 2010 年年中添加的。到 2016 年,我有与此相当的数据(我在日期之间添加了期间和组信息):

INSERT INTO elements VALUES(112, 'Cn',  'Copernicium',   285.1800, 7, '12', 'N');
INSERT INTO elements VALUES(113, 'Nh',  'Nihonium',      286.1800, 7, '13', 'N');
INSERT INTO elements VALUES(114, 'Fl',  'Flerovium',     289.1900, 7, '14', 'N');   -- Yes, Fl and Mc have the same weight
INSERT INTO elements VALUES(115, 'Mc',  'Moscovium',     289.1900, 7, '15', 'N');
INSERT INTO elements VALUES(116, 'Lv',  'Livermorium',   293.2000, 7, '16', 'N');
INSERT INTO elements VALUES(117, 'Ts',  'Tennessine',    293.2100, 7, '17', 'N');
INSERT INTO elements VALUES(118, 'Og',  'Oganesson',     294.2100, 7, '18', 'N');

我很感兴趣经历了周期性 table 的 'completion',至少是它的前七个周期。

(如果你好奇的话,你可以在维基百科上找到关于假设的 Uunennium(119 号元素,Uue)和 Unbinilium(120 号元素,Ubn)的信息。还有 Beyond element 118: The next row of the Periodic Table。)