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

标签 c arrays pointers struct typedef

我有以下代码会产生一条警告,指出“警告:初始化从未经强制转换的整数生成指针”。

如果我将数据类型 *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;
}

关于元素周期表的相关信息

我注意到所有元素现在都有一个字母或两个字母的符号;像 Uub 这样的 3 字母符号现在都被“真实”的名字所取代。 (参见 WebElements 作为一种信息来源——毫无疑问还有许多其他信息来源,例如维基百科 Periodic Table of Elements。)

早在 2010 年,我就有一个带有条目的元素 SQL 表(N 表示“不稳定”或“放射性”):

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');

经历了元素周期表的“完成”,至少在它的前七个周期,这让我很感兴趣。

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

关于c - 在 C 中使用带指针的结构和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53146419/

相关文章:

c - 在 C 中生成随机 UNIQUE 并转换为二进制

c - tolower 用于 C 风格的字符串

javascript - 如何根据多个条件对对象数组重新排序?

PHP:在多维数组中查找字符串或返回空数组键?

.net - 托管对象,为什么不会(^)。编译?

c++ - 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?

c++ - 如何编写指向函数的函数指针,返回指向函数的函数指针?

c++ - 括号中的类型定义

ios - Xcode 6.3 上架构 x86_64 的 undefined symbol

javascript - 按元素 ID 对元素数组进行排序