#include <stdio.h>
struct audiocd {
char title[256];
int trackNo;
char type;
char publisher[256];
};
int main() {
struct audiocd* cdptr;
struct audiocd cdarray[4];
cdptr = cdarray;
printf("%d\n", &(cdarray[2]));
printf("%d\n", cdptr);
}
什么是cdarray[2] & cdptr
?
编辑:谢谢,但如果printf("%d\n", &cdarray)
是4291520
,是否可以追踪printf("%d\n", &(cdarray[2])) & printf("%d\n", cdptr)
?
答案 0 :(得分:4)
程序的整体效果只是未定义的行为。它将地址传递给printf,但使用%d
转换,它需要一个int。不匹配会导致不确定的行为。
在典型情况下,int和指针的大小相同,它会打印出cdptr
中的地址和cdarray[2]
的地址。
如果你想打印出这些地址,显而易见的方法是:
printf("%p", (void *)&cdarray[2]); // (void *)cdarray+2
printf("%p", (void *)cdptr);
至于那些表达式“是”,它们分别是地址 - 数组开头的地址和数组的第三个元素。
答案 1 :(得分:0)
这是你应该如何打印(%u而不是%d来打印指针的地址)
#include <stdio.h>
struct audiocd {
char title[256];
int trackNo;
char type;
char publisher[256];
};
int main() {
struct audiocd* cdptr;
struct audiocd cdarray[4];
cdptr = cdarray;
printf("%u\n", (cdarray[2]));
printf("%u\n", cdptr);
}
顺便说一句,你的代码只是打印结构audiocd数组的第1和第3个元素的内存地址。
答案 2 :(得分:0)
谢谢,但如果是printf(“%d \ n”, &amp; cdarray)是4291520,是否有可能 跟踪printf(“%d \ n”,&amp;(cdarray [2])) &安培; printf(“%d \ n”,cdptr)。
如果我的问题正确,我想你想从cdarray的值推断&amp;(cdarray [2])和&amp;(cdptr)的值。
当您将cdarray分配给cdptr时,cdptr将存储该数组的起始地址。现在&amp;(cdarray [2])只是
cdarray + 2*sizeof(struct audiocd)
另外,如上所述,%p应该用于打印内存地址而不是%d。