繁体   English   中英

指针 - 混乱

[英]Pointers - confusion

我想知道使用指针是否总是更好。 我有一个只有一个字节(或一些整数)的结构。 该结构包含例程的参数,并将在那里传递。 如果我不使用指针(在结构内部),但通过指针传递此结构,那么在main_loop中进行的更改(对于logPrio)是否可以在外部(即在main中)可见?

请看这个样本让我:

typedef struct mainloop_param_t
{
  unsigned char *logPriop;
  //or versin w/o pointer 
  unsigned char logPrio;
}mainloop_param_t;

int main()
{
  mainloop_param_t mlparams;


  unsigned char logPrio;
  mlparams.logPriop = &logPrio;
  // or nothing cause mlparams.logPrio already initialized
  // would mlparams.logPrio be a copy or original?  

  g_timeout_add (5000, (GSourceFunc)main_loop, &mlparams);
}

我想知道使用指针是否总是更好。

在需要时使用指针。 不必要地使用它可能会导致您和其他读者稍后混淆。

如果我不使用指针,那么在main_loop中进行的更改(对于logPrio)是否会在外部(即在main中)可见?

在全局变量和结构为YES的情况下,否则为NO。

如果我不使用指针(在结构内部),但通过指针传递此结构,那么在main_loop中进行的更改(对于logPrio)是否可以在外部(即在main中)可见?

是的,在你传递了mlparams的地址后,无论是指针还是mlparams中的变量,main_loop中的每个更改都可以在main中看到。

我想你的问题是指针应该被使用的时候。 在我看来,指针只是一个访问数据的工具,它本身不应该是一个问题。 重要的是“数据应该放在哪里?” 和“程序如何访问数据?”

以下是用法的一部分:

  1. 数据在这里(本地),将在这里访问 - >只需定义和使用局部变量
  2. 某处的数据(另一个范围,例如外部),将在此处访问 - >定义指向数据的指针,并通过运算符访问数据*
  3. 数据在这里,将在某个地方访问(另一个范围,例如内部) - >定义一个变量并在某处传递变量的地址
  4. 某处的数据并将在其他地方访问 - >定义指向数据的指针并将指针传递到其他地方
  5. 有时您需要一些可能存在大量数据的数据,将所有数据复制到堆栈(可能导致溢出),最好复制数据开头的地址。 地址的副本只是一个指针。
  unsigned char logPrio;
  mlparams.logPriop = &logPrio;

在此代码中,使用指针没有任何意义。 更改发生在main中,并且对于g_timeout_add可见,因为您将此结构传递给该函数。

我认为你对参数如何通过指针传递给函数感到困惑。 如果你有像这样的功能

void func (int x)
{
  x = 2;
}

那么传递给函数的原始变量不会改变,因为函数内部的x是来自调用者的变量的副本。

int var = 1;
func(var);
printf("%d", var); // will print 1

如果要更改变量的值,则必须编写如下函数:

void func (int* x)
{
  *x = 2;
}

int var = 1;
func(&var);
printf("%d", var); // will print 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM