【问题标题】:what is the "pointer to a pointer" in c language? [duplicate]c语言中的“指向指针的指针”是什么? [复制]
【发布时间】:2013-06-27 20:33:39
【问题描述】:

你究竟是如何使用操作符**(指向指针的指针)?

我看到这些操作符是用来声明一个变量的,并且是通过一个结构来声明的,比如

struct name_of_struct **p_strutture;

它到底是做什么的?创建的变量是什么?

这如何等同于 *ptr[]?

它有什么意义?

什么时候在程序中使用指向指针的指针很重要?

【问题讨论】:

  • C 中没有“指针指针”运算符。您提供的是声明。里面根本没有运营商。你所拥有的只有两个 * 字符。两者都只是字符,它们不是运算符。
  • @AndreyT 抱歉,我的意思是指向指针数据类型的指针?
  • 我支持@djf:您需要返回并重新阅读有关 c 的基本参考。指针是在 c 中进行任何非平凡编码的基础,任何质量的每种资源都解释了它们。

标签: c pointers operators structure


【解决方案1】:

指向一个指针的指针基本上存储了另一个指针的地址。一个变量有一个内存位置,一个指针变量用于存储这个地址。类似地,指针变量具有内存地址,指向指针的指针存储这样的内存地址

【讨论】:

  • 我们可以有一个指向指针的指针吗?有一个指向指针的指针有什么意义?
  • "我们可以有一个指向指针的指针吗?" 是的,当然可以。但是,如果您编写的代码中明确指出了这样的事情,那么有人可能会拿着斧头追上您。
  • 当然,我们可以有任何这样的间接级别,并且可以从上面推断出这样的事情的含义
  • 谢谢!程序中通常何时使用指向指针的指针?
【解决方案2】:

struct name_of_struct ** 类型是指向struct name_of_struct 的指针的指针,请参见此处的示例:

// strutture is a struct name_of_struct object
struct name_of_struct strutture;

// p1_strutture is a struct name_of_struct * object
struct name_of_struct *p1_strutture = &strutture;

// p_strutture is a struct name_of_struct ** object
struct name_of_struct **p_strutture = &p1_strutture;

& 运算符产生一个指向对象的指针。

【讨论】:

  • 这与 *ptr[] 有何等价性?
  • 指向变量的指针也有指针?这怎么可能?
  • user2493976 已经回答了我的问题。谢谢。
  • @mc8 我可以建议你阅读 Torek 的优秀文章 web.torek.net/torek/c/pa.html 关于数组和指针之间的特殊关系
【解决方案3】:

如果您声明:
char **myPointer;

你得到一个指向指针的指针。

Why would you do such a thing? 

如果您希望例如保存一些字符(文本),您可以使用二维数组,或者您可以使用指向指针的指针。

对于二维数组,最长的单词会“分配”您的数组大小(因此非常短的单词会浪费内存)。使用指向指针的指针不会浪费内存!在这种情况下,更优雅的是一个指针数组,并且该数组内的每个指针都指向一个 char 数组。

myPointer = calloc(2, sizeof(char*));
char pointer1[] = "hello";
char pointer2[] = "world";

*myPointer = pointer1;
*(myPointer + 1) = pointer2;

*myPointer 的值会给出指针 1 的地址。

*pointer1 的值会给你'h'

这将是相同的:*( (*myPointer)) 并且也将具有值:'h'

使用:*( (*myPoniter) + 1) 你得到值:'e'

而 *( *(myPointer + 1) ) 将返回:'w'

【讨论】:

  • myPointer 是从哪里来的?
  • myPointer 是指向pointer1的指针吗?和 *myPointer 将给出指针 1 的值,它是一个地址?
  • 我理解正确吗?
  • @JimBalter 我问“myPointer 是从哪里来的?”因为它没有在 myPointer 指向的任何地方说明。但是,显式声明了使用指针1、指针和指针3。我假设他忘记声明 myPointer 是指向上面给出的指针数组的指针。我澄清了,他也证实了。我只是做了一个假设。
  • @JimBalter 我不是故意粗鲁的。只是我得到了我需要的答案。然后你真的必须对所有事情发表评论。我理解您的第一条评论,即这个问题并不真正符合 SO 的高标准。我承认这一点。但你不必坚持,让我感到气馁,因为正如我所说,我还是个初学者,而这里的很多其他人都好心地帮我一把。我试图在互联网上搜索答案,我确实这样做了,但我认为 SO 是一个对这些答案给出明确解释的网站。
【解决方案4】:

pointer to a pointer 存储指针变量的地址。指针变量与其他变量一样被分配一个内存位置。所有指针的值的实际数据类型,无论是整数、浮点数、字符还是其他,都是一样的,都是一个长的十六进制数,代表一个内存地址。

但请记住,指针值的表示取决于平台。它们可能是简单的整数值(如在平面内存模型中),或者它们可能是结构化值,如页码和偏移量(对于分段模型),或者它们可能完全是其他东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-29
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2017-06-19
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多