繁体   English   中英

指针变量的地址

[英]address of a pointer variable

我目前正在学习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); 
  }
}
&(ptr + i)->c

这将获取存储在ptr的第ith个元素处的变量c的地址。 因此,您的第一个直觉是正确的。

ptr+i

只是算术上找到数组第ith个元素的指针。

(ptr+i)->c

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

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

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

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

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

另外,我知道这并没有完全按照您的想象做,因为您认为address-of运算符应用于指针,而只是一个FYI:您确实可以获取指针的地址。 这样的构造是指向指针的指针,并且在您要更改函数中的指针(不仅是存储在其指向的地址中的值)时很有用。 例如

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

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

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

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

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

struct name* ptr;

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

struct name** p = &ptr;

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

在您的情况下,您正在传递指向scanf指针,并具有一个动态的name数组,因此

&(ptr + i)->c

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

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

暂无
暂无

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

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