指向常量结构数组作为函数参数的C常量指针

指向常量结构数组作为函数参数的C常量指针,c,arrays,pointers,reference,C,Arrays,Pointers,Reference,如何通过传递数组指针并在Alt.1中获取请求的数组引用,使Alt.1按预期工作 struct mystruct { int id1; int id2; }; const struct mystruct local_struct[] = { {0, 55}, {1, 66}, }; // Alt.1 i like to make this work (not working) int get_reference_1(const struct mystruct *

如何通过传递数组指针并在Alt.1中获取请求的数组引用,使Alt.1按预期工作

struct mystruct
{
    int id1;
    int id2;
};

const struct mystruct local_struct[] = {
    {0, 55},
    {1, 66},
};

// Alt.1 i like to make this work (not working)
int get_reference_1(const struct mystruct *s){

   s = local_struct;
   return 0;
}

// Alt.2 works perfect but i like to use the return as status as in Alt.1.
const struct mystruct *get_reference_2(){
   return local_struct;
}

int main()
{
  struct mystruct *s = NULL;

  // Alt.1
  if(get_reference_1(s))
     /* Expected Fail*/
  else
     /* Expected Success*/

  // Alt.2
  s = get_reference_2()
  if(!s)
     /* Expected Fail*/
  else
     /* Expected Success*/

  return 0;
}
也许我想错了,我需要传双分球

编辑:用“const”更正。
Edit2:更新的标题。

s=local\u struct正在更改局部变量-它不会更改main中的变量。传递变量的地址,并对原始变量进行更改,取消引用该变量

int get_reference_1(struct mystruct **s){

   *s = local_struct;
   return 0;
}
打电话是

  if(get_reference_1(&s))
     /* Expected Fail*/
  else
     /* Expected Success*/
另外,将
const
变量分配给非const变量也会使编译器抱怨。这里的
local_struct
是在代码中声明的常量
struct
。解决方案检查您是否做了正确的事情-此任务是否必要?您还可以根据需要添加
const
限定符:

int get_reference_1(const struct mystruct **s){
   *s = local_struct;
   return 0;
}
...
const struct mystruct *s = NULL;

在最坏的情况下,删除
常量
限定符。

s=local\u结构正在更改局部变量-它不会更改main中的变量。传递变量的地址,并对原始变量进行更改,取消引用该变量

int get_reference_1(struct mystruct **s){

   *s = local_struct;
   return 0;
}
打电话是

  if(get_reference_1(&s))
     /* Expected Fail*/
  else
     /* Expected Success*/
另外,将
const
变量分配给非const变量也会使编译器抱怨。这里的
local_struct
是在代码中声明的常量
struct
。解决方案检查您是否做了正确的事情-此任务是否必要?您还可以根据需要添加
const
限定符:

int get_reference_1(const struct mystruct **s){
   *s = local_struct;
   return 0;
}
...
const struct mystruct *s = NULL;

在最坏的情况下,删除
常量
限定符。

在这里,您可以随心所欲

struct mystruct
{
    int id1;
    int id2;
};

 struct mystruct local_struct[] = {
    {0, 55},
    {1, 66},
};

// Alt.1 i like to make this work (not working)
int get_reference_1(struct mystruct **s){

   *s = local_struct;
   return 0;
}

// Alt.2 works perfect but i like to use the return as status as in Alt.1.
struct mystruct *get_reference_2(){
   return local_struct;
}

int main()
{
  struct mystruct *s = NULL;

  // Alt.1
  if(get_reference_1(&s))
  {  
      /* Expected Fail*/
  }
  else
  {
      /* Expected Success*/
  }   

  // Alt.2
  s = get_reference_2();
  if(!s)
  {   
      /* Expected Fail*/

  }
  else
  {
      /* Expected Success*/
  }   

  return 0;
}

它将成功执行。

这是您想要的

struct mystruct
{
    int id1;
    int id2;
};

 struct mystruct local_struct[] = {
    {0, 55},
    {1, 66},
};

// Alt.1 i like to make this work (not working)
int get_reference_1(struct mystruct **s){

   *s = local_struct;
   return 0;
}

// Alt.2 works perfect but i like to use the return as status as in Alt.1.
struct mystruct *get_reference_2(){
   return local_struct;
}

int main()
{
  struct mystruct *s = NULL;

  // Alt.1
  if(get_reference_1(&s))
  {  
      /* Expected Fail*/
  }
  else
  {
      /* Expected Success*/
  }   

  // Alt.2
  s = get_reference_2();
  if(!s)
  {   
      /* Expected Fail*/

  }
  else
  {
      /* Expected Success*/
  }   

  return 0;
}


它将成功执行。

有许多重复项。显然,您仍然不太了解指针是如何工作的,请阅读更多关于它的内容。它不起作用的原因是
s
get\u refereec\u 1
的本地对象。您必须传递指向要更新的poitner的指针。为什么要调用全局结构“
local\u struct
”?你想迷惑敌人吗?@IharobAlAsimi:更新为const@EugeneSh。这只是我问题的一个简短例子。我在一个更大的系统里工作,我不能包罗一切。很抱歉搞混了。有很多重复的。显然,您仍然不太了解指针是如何工作的,请阅读更多关于它的内容。它不起作用的原因是
s
get\u refereec\u 1
的本地对象。您必须传递指向要更新的poitner的指针。为什么要调用全局结构“
local\u struct
”?你想迷惑敌人吗?@IharobAlAsimi:更新为const@EugeneSh。这只是我问题的一个简短例子。我在一个更大的系统里工作,我不能包罗一切。抱歉搞混了。现在我的网很糟糕。我的编辑速度很慢。。很抱歉。@dasblinkenlight.:
const struct mystruct*a
基本上是说
a
是指向const的指针。修改结构的值将是非法的。但是指针是自由的。我们可以在任何地方指出这一点。所以我们只能读这个指针。如果我们想通过修改结构实例的某个成员来创建链接节点,那么它会抱怨。(通过
p
我们将访问它)。感谢您的编辑。由于OP的
local_struct
标记为
const
,我们别无选择,只能生成指向它的
const
指针。否则,我们可能会通过指向它的指针意外地修改
local_struct
,从而导致未定义的行为。保持
s
可修改的唯一方法是从
local\u struct
@dasblinkenlight中删除
const
。正确的说法是指向const struct的指针吗?我只是在努力写得更清楚。@dasblinkenlight,目的是为了避免修改,因此是常量。现在我的网络很糟糕。我的编辑速度很慢。。很抱歉。@dasblinkenlight.:
const struct mystruct*a
基本上是说
a
是指向const的指针。修改结构的值将是非法的。但是指针是自由的。我们可以在任何地方指出这一点。所以我们只能读这个指针。如果我们想通过修改结构实例的某个成员来创建链接节点,那么它会抱怨。(通过
p
我们将访问它)。感谢您的编辑。由于OP的
local_struct
标记为
const
,我们别无选择,只能生成指向它的
const
指针。否则,我们可能会通过指向它的指针意外地修改
local_struct
,从而导致未定义的行为。保持
s
可修改的唯一方法是从
local\u struct
@dasblinkenlight中删除
const
。正确的说法是指向const struct的指针吗?我只是想写得更清楚一些。@dasblinkenlight,目的是为了避免修改,因此是const。谢谢你的快速回复,这个回复和之前的建议回复一样有效。谢谢你的快速回复,这个回复和之前的建议回复一样有效。