指针变量的地址

时间:2013-10-02 15:27:00

标签: c++ c

我目前正在学习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); 
  }
}

4 个答案:

答案 0 :(得分:2)

&(ptr + i)->c

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

ptr+i

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

(ptr+i)->c

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

答案 1 :(得分:2)

代码&(ptr + i)->c为您提供属于列表中第i个结构的struct element c的地址。让我们分解一下。

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

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

&(ptr + i)->c通过指针(ptr + i)获取struct element c的地址。

另外,我知道这并不是你想的那么做,因为你认为地址操作符应用于指针,但只是一个FYI:你确实可以获取指针的地址。这样的构造是指向指针的指针,当你想要在函数中改变指针(不仅仅是存储在它所指向的地址的值)时,它很有用。 e.g。

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

答案 2 :(得分:1)

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

其次,在您提供的代码中,实际上没有一个&实例应用于指针。您的代码中有&的四个应用程序

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

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

答案 3 :(得分:0)

struct name* ptr;

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

struct name** p = &ptr;

通过获取已创建指针的地址,创建指向name指针的指针。

在您的情况下,您传递指向scanf的指针,并且动态数组为name,所以

&(ptr + i)->c

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

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