在 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].eleNum
或 database[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。)
我有以下代码会产生一条警告 "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].eleNum
或 database[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。)