C程序在没有指针的情况下不断列出地址而不是值

C程序在没有指针的情况下不断列出地址而不是值,c,C,我正在创建一个代码,将今天的日期与结构中的日期数组进行比较。每次我尝试打印日期时,我都会返回地址,而不是实际值本身 #include <stdio.h> struct date { int month[2]; int day[2]; int year[4]; }; int cmpDate(struct date date1, struct date date2) { if (date1.year > date2.year) return

我正在创建一个代码,将今天的日期与结构中的日期数组进行比较。每次我尝试打印日期时,我都会返回地址,而不是实际值本身

#include <stdio.h>
struct date {
    int month[2];
    int day[2];
    int year[4];
};

int cmpDate(struct date date1, struct date date2)
{
if (date1.year > date2.year)
        return 1;
    if (date1.year < date2.year)
        return -1;
    if (date1.year == date2.year)
    {
        if (date1.month > date2.month)
            return 1;
        if (date1.month < date2.month)
            return -1;
        if (date1.month == date2.month)
        {
            if (date1.day > date2.day)
                return 1;
            if (date1.day < date2.day)
                return -1;
            if (date1.day == date2.day)
                return 0;
        }
    }
};

struct date list[10] = { { 12, 3, 2016 },
{ 12 , 8 ,2012 },
{ 9, 3, 2016 },
{ 11, 7, 2012 },
{ 11, 7, 2020 },
{ 11, 7, 2016 },
{ 8, 1, 2017 },
{ 12, 29, 2017 },
{ 10, 1, 2018 } };

int main(void)
{
    struct date today;
    int i;
    int j = 0;

    printf("Enter todays date in the following format: MM DD YYYY:\n");
    scanf_s("%d %d %d", today.month, today.day, today.year);
    printf("\n");

    for (i = 0; i < 10; i++)
    {
        printf("%d %d %d\n", list[i].month, list[i].day, list[i].year);
        printf("%d %d %d\n", today.month, today.day, today.year);
        printf("%d\n", j);
    }

}
J只是我要调用函数cmpDate的一个占位符,所以现在它并不重要。有人能帮我打印值而不是地址吗


谢谢。

因为结构的成员是数组,引用它们的名称(例如
列表[i])。day
实际上会导致指向数组的指针。您需要在
printf
函数中分别引用数组中的每个元素来打印所有数字。

您的数据结构定义不正确

我想你是这么想的

int year[4];
year
定义为4位整数。它不是。而是将其定义为4
int
值的数组

试图处理
int[4]
对象作为
int
对象会导致需要一段时间才能描述的问题。这与数组和指针之间的关系有关。有关详细信息,请参阅的第6节。但与此同时,与其担心为什么会得到类似于地址的东西,不如修复代码

int year;

一个
int
保证能够保存至少65535个值,并且在大多数系统上,您可能会使用大约20亿个值,因此您不需要做任何特殊的事情来表示年份。(如果您这样做了,您可以使用类型
long
而不是
int
,并对代码进行相应的调整以处理不同的类型,但在这里这不是必需的。)

int-month[2];int-day[2];int-year[4];
int-month;int-day;int-year;
scanf's(“%d%d%d”,today.month,today.day,today.year);
-->
scanf_s(“%d%d%d”、&today.month、&today.day、&today.year)
如果编译器没有警告您参数与
printf
的格式字符串不匹配,您需要启动编译器警告或获取不同的工具链,即使如此,仍然会启动它们。它会导致指向数组初始元素的指针,而不是指向整个数组。它是相同的内存地址,但是具有不同的类型。在任何情况下,使用
%d
格式将指针值传递到
printf
都有未定义的行为(最有可能的结果是打印地址的十进制形式)。
int year;