1

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

4 回答 4

2
&(ptr + i)->c

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

ptr+i

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

(ptr+i)->c

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

于 2013-10-02T15:29:40.753 回答
2

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

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

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

&(ptr + i)->c通过指针获取结构元素 c 的地址(ptr + i)

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

int a = 5; /* regular variable */
int* pa = &a; /* pointer to a */
int** ppa = &pa; /* pointer to pointer (which points to a) */
于 2013-10-02T15:33:46.730 回答
1

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

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

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

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

于 2013-10-02T15:39:59.530 回答
0
struct name* ptr;

这将创建一个指向 a 的指针name

struct name** p = &ptr;

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

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

&(ptr + i)->c

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

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

于 2013-10-02T15:31:00.340 回答