【问题标题】:address of a pointer variable指针变量的地址
【发布时间】:2013-10-02 15:26:59
【问题描述】:

我目前正在学习c语言,我碰到了这段代码。 ptr 已经是指针类型的变量,那么& 操作符对它有什么影响,因为我知道通常操作符是用来获取非指针变量的地址的。

struct name {
  int a; float b; char c[30];
};
int main()
{
  struct name *ptr;
  int i,n;
  printf("Enter n: ");
  scanf("%d",&n);
  ptr = (struct name*)malloc(n*sizeof(struct name));
  /* Above statement allocates the memory for n structures with pointer ptr pointing to       base address */ 
  for(i=0; i<n; ++i) { 
    printf("Enter string, integer and floating number respectively:\n");
    scanf("%s%d%f", &(ptr+i)->c, &(ptr+i)->a, &(ptr+i)->b); 
  }
}

【问题讨论】:

  • @P0W:抛开编码风格和坏习惯不谈,这似乎是完全有效的 C++。
  • @JohnDibling 我偶尔会设法从问题中编译 C 方法,而无需使用 Java 进行修改,但这并不意味着这些问题应该同时使用 Java 和 C 进行标记。以类似的方式,问题应该' t 用 C 和 C++ 标记。 C++ 标签通常会导致特定于 C++ 的建议,这对 OP 没有帮助。
  • @Dukeling:也许吧,但 OP 用两种语言标记它是有原因的。也许不是一个很好的理由,而是一个理由。除了在 OP 中提到“c”之外,这里没有任何内容表明所讨论的语言不能是 C++。提问者需要澄清。

标签: c++ c


【解决方案1】:
&(ptr + i)->c

这获取存储在 ptr 的第 i 个元素中的变量 c 的地址。所以你的第一个直觉是正确的。

ptr+i

只是用于查找数组的第 i 个元素的指针算术运算。

(ptr+i)->c

从该结构访问字段c&amp; 获取该变量的地址。

【讨论】:

  • 当我试图通过 poinetr 访问该列表中的成员来构建它时抛出异常“[Error] 为成员 'info/next' 请求的我不是结构或联合” void struct Node_rec { int info;结构 Node_rec* 下一个;结构 Node_rec* 上一页; }; typedef struct Node_rec 节点; struct List_rec{ 节点* 最后一个;节点*优先;国际化;整数; }; typedef struct List_rec 列表; void make_list(List l1,int new_info) { Node* node=(Node*)(malloc(sizeof(Node*)));节点信息=新信息; node.next=NULL; node.prev=NULL; l1.first=节点; l1.last=节点; l1.len=1; l1.sum=new_info; }
【解决方案2】:

代码&amp;(ptr + i)-&gt;c 为您提供了属于您列表中第i 个结构的结构元素c 的地址。让我们分解一下。

(ptr + i) 是指针运算。它将 i 添加到存储在 ptr 的地址中。

(ptr + i)-&gt;c通过指针(ptr + i)访问struct元素c。

&amp;(ptr + i)-&gt;c通过指针(ptr + i)获取struct元素c的地址。

另外,我知道这并没有完全按照你的想法做,因为你认为地址操作符应用于指针,但只是一个仅供参考:你确实可以获取指针的地址。这样的构造是指向指针的指针,当您想要更改函数中的指针(不仅仅是存储在它指向的地址处的值)时,它很有用。例如

int a = 5; /* regular variable */
int* pa = &a; /* pointer to a */
int** ppa = &pa; /* pointer to pointer (which points to a) */

【讨论】:

  • 谢谢,我改写了一下。现在可能更清楚了。
  • 绝对更好。干杯。
【解决方案3】:

首先,使用C和C++语言中的&amp;运算符来获取任意变量的地址。更准确地说,它可用于获取 [几乎] 任何 lvalue 的地址(在这方面 C 和 C++ 之间存在一些差异)。指针变量是普通变量。它们没有什么特别之处,这意味着看到运算符&amp; 应用于指针并没有什么异常。

其次,在您提供的代码中,实际上没有将 &amp; 的单个实例应用于指针。你的代码中有&amp;的四个应用

&n
&(ptr+i)->a
&(ptr+i)->b
&(ptr+i)->c

在前两种情况下,它应用于int 对象。在第三种情况下,它应用于float 对象。在最后一种情况下,它应用于char [30] 对象。没有指针。

【讨论】:

    【解决方案4】:
    struct name* ptr;
    

    这会创建一个指向name 的指针。

    struct name** p = &ptr;
    

    这会通过获取您已经创建的指针的地址来创建指向name 的指针。

    在你的例子中,你传递了指向scanf的指针,并且有一个name的动态数组,所以

    &(ptr + i)->c
    

    找到数组的第i个元素,并将其c成员的地址返回给scanf(与ab相同)。

    传入指针的地址允许更改该指针(例如重新分配)。在 C++ 中,它实际上与通过引用传递相同。

    【讨论】:

      猜你喜欢
      • 2020-12-30
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多