【问题标题】:What exactly int/char when we declare double pointer(**q)当我们声明双指针(**q)时,究竟是什么 int/char
【发布时间】:2016-02-01 16:44:18
【问题描述】:

让我们使用 64 位机器

在 64 位机器中指针为 8 字节

int *p ; // it is a pointer to integer variable so when i increment p
         // i.e., p++ it will increment by 4 

char *r; // It is pointer to character . 
         // So if i increment 'r' it will increment by 1

int **q ; // if i increment q  ie.,q++ it will increment 8 bytes 

我尝试了这种和平的代码,如果有任何问题请纠正我

int a=10; 
int *p; 
char *r; 
int **q; 
p=&a; 
q=&p; 
printf("p= %p\t r= %p\t q=%p\n",p,r,q);
 printf("p(increment)= %p\t r (increment)= %p\tq (increment)= %p ",++p,++r,++q); 

输出

 p= 0x7fff669bb1bc r= 0x7fff669bb2a0 q=0x7fff669bb1a0
 p(increment)= 0x7fff669bb1c0 r (increment)= 0x7fff669bb2a1 q (increment)= 0x7fff669bb1a8

int/char/float在双指针中的作用是什么?

【问题讨论】:

  • 对不起,这是新行 int **q ; // 如果我增加 q ie.,q++ 它将增加 8 个字节 int/char/float 在双指针中的作用是什么?提前致谢
  • where pointer is of 8 bytes in 64 bit machine 你确定吗,你试过 MSVC 了吗?
  • 在 linux 64 位机器指针大小为 8
  • 在那台机器上。一般来说,指针没有大小保证。
  • @Vivek 是吗?你能告诉我一些可以保证的东西(引用)吗?

标签: c pointers types pointer-to-pointer


【解决方案1】:

引用后缀 ++ 运算符的属性,来自 C11,第 §6.5.2.4 章,后缀递增和递减运算符,(强调我的

后缀++ 运算符的结果是操作数的值。作为一个副作用, 操作数对象的值递增(即,适当类型的值 1 为 添加到它)。 [...]

  • int *p ;的情况下,p是指向int类型的指针,因此增量将基于sizeof(int)

  • int **p ;的情况下,p是指向int *类型的指针,因此增量将基于sizeof(int *)

【讨论】:

  • 这篇引文不多说了。下一句是有趣的:See the discussions of additive operators and compound assignment for information on constraints, types, and conversions and the effects of operations on pointers. 指针算术工作原理的解释可在 6.5.6/7 及更高版本中找到。
  • @Lundin 是的,先生,非常正确。我只是想指出 适当的类型 部分。我觉得在这种情况下将讨论扩展到如何会有点额外。您是否建议我扩展此答案以涵盖该方面?
  • 我认为任何标准文本在这里都不是特别有用(尤其是可读性不强的 6.5.6),因为我们正在与初学者打交道。
【解决方案2】:

嗯,这不仅取决于您的机器,还取决于您的实现。您可以通过输出sizeof psizeof rsizeof q 来找出它们。打印sizeof (int *)sizeof (char *)sizeof (int **) 也可以。

C 程序员传统上喜欢知道很多东西(也许比他们 需要)关于底层机器实现。

在我看来,你不需要知道这些东西,因为编译器会很好地为我们处理这些(根据 C 标准)。此外,大多数使用这些东西的做法本质上是未定义的行为。

【讨论】:

    【解决方案3】:

    int **p 中,您将指针增加它指向的大小(即指针)。因为指针的大小是8,所以会增加8

    final 类型在这里没有任何作用。它的行为与指向void 的指针的行为相同。

    【讨论】:

    • 指针不能保证大小相同。 C 允许: sizeof( void* ) != sizeof( int* )
    • 权限为省略。该标准没有要求所有指针都应具有相同的大小。
    • @ZbynekVyskovsky-kvr000 c 标准没有明确要求所有指针的大小相同。
    • C 标准确实要求所有指针都应转换为void*,然后再转换回来。如果“任何指针类型”的大小与void* 不同,那将是不可能的。因此,每个指针类型必须具有相同的大小。实际上,所有具有扩展地址的 CPU 都会为此使用一些非标准语法。
    • @Lundin 您假设较大的类型不能容纳较小的类型。我不认为这是正确的。为什么 void* 不能容纳更小的类型?
    猜你喜欢
    • 2011-05-18
    • 2023-03-29
    • 2021-03-07
    • 2019-01-15
    • 2010-10-14
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多