【问题标题】:Is int * x equivalent to int * int x?int * x 是否等同于 int * int x?
【发布时间】:2012-04-02 05:53:47
【问题描述】:

int * x时,指针的类型是否有隐含的int,所以隐含的就是int * int x

【问题讨论】:

标签: c


【解决方案1】:

没有。 int * xx 声明为“指向int 类型对象的指针”类型的变量。

【讨论】:

  • 为什么我突然闪回“谁先上?”。
  • @Randomblue:指针不是int。指针算术不同于int 算术(p + 1i + 1)等。指针本身就是类型。如果您想知道它们存储了多少字节,请使用sizeof x。也许你会得到与sizeof int 相同的结果,但这并不能保证。
  • 谢谢布赖恩,又浪费了 8 分钟来嘲笑 You Tube 剪辑。
  • @Duck - 令人惊讶的是,该草图的支撑力如此之好,不是吗?
【解决方案2】:

没有。指针的大小不一定与int 相同。这在某些架构上尤其重要,如果您还考虑到函数指针之类的东西。

【讨论】:

  • @CarlNorum:啊哈。指针类型的符号是*?谢谢,我想我现在明白了。
【解决方案3】:

当你写int *x 时,没有任何隐含的任何东西x 是一个指针,但它不指向任何东西。 x 的类型是 int *

int * int x 根本不是合法语法。

【讨论】:

  • 它相当悬空。如果你真的很幸运,它可能指向一些有效的东西。
  • 是的,但即便如此,依赖未定义的行为也可能是一个糟糕的主意。
【解决方案4】:

指针一种类型。它不是整数,不是浮点数,不是双精度数,不是字符,不是长整数。 它所包含的内容取决于您为其编译代码的机器的体系结构。

当您对指针(+=-=)进行算术运算时,结果与对整数进行运算时的结果不同。

您还会注意到char *int * 是不同的类型。您可能可以在两者之间进行转换,但是当您增加它们时,除非sizeof int == 1 您得到不同的结果。

您可能想知道指针占用的大小。然后尝试以下操作:

printf("%u %u %u %u\n", sizeof(char), sizeof(int), sizeof(int *), sizeof(long));

注意不同类型的指针can have的大小不同。

【讨论】:

  • 你能用sizeof(*) 或类似的东西代替sizeof(int *) 吗? [因为sizeof(int *) 中的int 是多余的/无用的。]
  • @Randomblue:没有。您可以typedef int *int_ptr 并使用sizeof(int_ptr)
  • @Randomblue: int 不是是多余的或无用的;指向 int 的指针的大小可能与指向其他类型的指针的大小不同。没有单一的“指针”类型;有多种“指向 T 的指针”类型。
  • 我讨厌“可以”与“做”的争论,所以我会撤回该声明,因为我无法编辑它:)
【解决方案5】:

学习 C 时容易混淆的东西是 * 字符。它实际上有两种完全不同的用途:

  1. 创建指针变量
  2. 用作间接运算符

您可以使用 Address-of & 运算符获取变量的指针地址(内存地址),并将其分配给指针变量。

// Using * to create a Pointer Variable (pointer to an int):
int * intPtr;

// Using the & Address-of Operator to get the Pointer Address (memory address) of a variable, and assign it to a Pointer Variable:
int x = 10;
intPtr = &x;

// Printing the value of `x`, which is 10:
printf("%d\n", x);

// Using the Indirection Operator *, on a Pointer Variable, to perform indirection:
*intPtr = 20;

// Above, we modified the value of `x` using indirection via `intPtr`. So now `x` is equal to 20, and not 10:
printf("%d\n", x);

printf() 输出:

10
20

正如其他人所提到的,int * int x; 在 C 中无效。

【讨论】:

    【解决方案6】:

    扩展我之前的评论...

    C 中没有单一指针数据类型。相反,您有多个“指向T”的数据类型——int * 是与 char * 不同的数据类型,后者是与double *,这是与 void (*)(...) 不同的数据类型,void (*)(...) 是与long (*)[N] 不同的数据类型,等等。

    即使所有指针类型都具有相同的大小和表示(大多数平台都是这种情况,但不能保证),语义也会有所不同。假设声明

    int  *ip =  (int *) 0x00004000;
    char *cp = (char *) 0x00004000;
    

    ipcp 都以相同的值开始(指向地址 0x00004000,这可能是无效的)。如果我执行语句

    ip++; // or ip = ip + 1;
    cp++; // or cp = cp + 1;
    

    ipcp 的结果值会不同; ip 将包含下一个 integer 的地址(0x00004002 表示 16 位整数或 0x00004004 表示 32 位整数),但 cp 将包含下一个 的地址>字符 (0x00004001)。指针算术依赖于指针的基本类型,因此对整数指针的操作将产生与对指向其他类型的指针的操作不同的结果。

    不同的指针类型可能有不同的大小。考虑一个字寻址架构,其中内存的基本单元可以是 16 位宽、24 位、32 位或 36 位。任何指向占用一个完整字的类型的指针都是 N 位宽,但 char * 类型将需要一些额外的位来指向单词中的特定字符(除非您决定 char 值也应该占据整个单词)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-26
      • 2012-10-04
      • 2010-09-11
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多