常量结构中常量指向结构元素的指针

时间:2015-06-01 19:34:25

标签: c pointers struct const

我试图通过常量指针访问结构元素。程序就像应该的那样工作,但是我从不兼容的指针类型中得到了警告和初始化#39;和'(接近初始化' B.settings)'。我真的不知道如何正确地进行初始化。有人可以帮我解决这个问题吗?

这是我的代码:

它只是一个较大部分的片段。想法是通过指向const结构的指针访问结构变量x,y。希望有意义。



#include <stdio.h>
#define PGM_STR(X) ((const  char[]) { X })

struct SettingsStruct 
{
    unsigned int x;
    unsigned int y;

}Settings;
  	
struct constitem
{
	const char * const  text;
	const struct constitem *next;
	const struct  SettingsStruct  * settings;
};

struct constitem const  A;

struct constitem const  B = {PGM_STR("x"), &A, &Settings.x };
struct constitem const  A = {PGM_STR("y"), &B, &Settings.y };

static const struct constitem *currMenuPtr=&A; 

void main()
{
	Settings.x = 1;
	Settings.y = 2;

  	printf("%s\n",currMenuPtr->text);
    printf("%d\n",*(currMenuPtr->settings));

    currMenuPtr = currMenuPtr->next;
  	
  	printf("%s\n",currMenuPtr->text);
  	printf("%d\n",*(currMenuPtr->settings));
}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

在您的代码中,Settings.xunsigned int,因此&Settings.xunsigned int *。您正尝试使用它来初始化const struct SettingsStruct *类型的值。编译器很抱怨 - 你在做什么是非常值得怀疑的,我想可能不是你真正想做的事情。这同样适用于Settings.y

看起来您可以通过将struct constitem的第三个元素的类型更改为unsigned int *来让编译器停止抱怨(关于此)。但是,你必须判断在你的程序的更大方案中这是否真的适合你。

如果在初始化程序出现时尚未声明&A,则在变量B的初始化程序中使用A时也会出现问题。因为你也在B的初始值设定项中引用A,你无法通过交换声明顺序来解决这个问题。如果你真的想要一个循环的指针链,那么指针值不能是const,因为在初始化之后至少需要修改其中一个。