【发布时间】:2012-04-02 05:53:47
【问题描述】:
写int * x时,指针的类型是否有隐含的int,所以隐含的就是int * int x?
【问题讨论】:
-
指针不是整数…
-
int * int x绝对没有任何意义。
标签: c
写int * x时,指针的类型是否有隐含的int,所以隐含的就是int * int x?
【问题讨论】:
int * int x 绝对没有任何意义。
标签: c
没有。 int * x 将x 声明为“指向int 类型对象的指针”类型的变量。
【讨论】:
int。指针算术不同于int 算术(p + 1≠i + 1)等。指针本身就是类型。如果您想知道它们存储了多少字节,请使用sizeof x。也许你会得到与sizeof int 相同的结果,但这并不能保证。
没有。指针的大小不一定与int 相同。这在某些架构上尤其重要,如果您还考虑到函数指针之类的东西。
【讨论】:
*?谢谢,我想我现在明白了。
当你写int *x 时,没有任何隐含的任何东西。 x 是一个指针,但它不指向任何东西。 x 的类型是 int *。
int * int x 根本不是合法语法。
【讨论】:
指针是一种类型。它不是整数,不是浮点数,不是双精度数,不是字符,不是长整数。 它所包含的内容取决于您为其编译代码的机器的体系结构。
当您对指针(+=、-=)进行算术运算时,结果与对整数进行运算时的结果不同。
您还会注意到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 是多余的/无用的。]
typedef int *int_ptr 并使用sizeof(int_ptr)。
学习 C 时容易混淆的东西是 * 字符。它实际上有两种完全不同的用途:
您可以使用 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 中无效。
【讨论】:
扩展我之前的评论...
C 中没有单一指针数据类型。相反,您有多个“指向T”的数据类型——int * 是与 char * 不同的数据类型,后者是与double *,这是与 void (*)(...) 不同的数据类型,void (*)(...) 是与long (*)[N] 不同的数据类型,等等。
即使所有指针类型都具有相同的大小和表示(大多数平台都是这种情况,但不能保证),语义也会有所不同。假设声明
int *ip = (int *) 0x00004000;
char *cp = (char *) 0x00004000;
ip 和 cp 都以相同的值开始(指向地址 0x00004000,这可能是无效的)。如果我执行语句
ip++; // or ip = ip + 1;
cp++; // or cp = cp + 1;
ip 和 cp 的结果值会不同; ip 将包含下一个 integer 的地址(0x00004002 表示 16 位整数或 0x00004004 表示 32 位整数),但 cp 将包含下一个 的地址>字符 (0x00004001)。指针算术依赖于指针的基本类型,因此对整数指针的操作将产生与对指向其他类型的指针的操作不同的结果。
不同的指针类型可能有不同的大小。考虑一个字寻址架构,其中内存的基本单元可以是 16 位宽、24 位、32 位或 36 位。任何指向占用一个完整字的类型的指针都是 N 位宽,但 char * 类型将需要一些额外的位来指向单词中的特定字符(除非您决定 char 值也应该占据整个单词)。
【讨论】: