在编写int * x
时,是否有指针类型的隐式int
,因此它隐含地为int * int x
?
答案 0 :(得分:3)
指针 是一种类型。它不是一个整数,它不是一个浮点数,它不是一个双重的,它不是一个字符,它不是一个长的。 它拥有的内容取决于您编译代码的机器的体系结构。
当您对指针(+=
,-=
)进行算术运算时,结果与使用整数进行算术时的结果不同。
您还会注意到char *
和int *
是不同的类型。你可以在两者之间施放,但是当你增加它们时,除非sizeof int == 1
得到不同的结果。
您可能想知道的是指针所占的大小。然后尝试以下内容:
printf("%u %u %u %u\n", sizeof(char), sizeof(int), sizeof(int *), sizeof(long));
请注意,不同类型的指针can have大小不同。
答案 1 :(得分:2)
扩展我的评论......
C中没有单指针数据类型。相反,您有多个“指向T
”数据类型的指针 - int *
是来自char *
的不同数据类型,这是来自double *
的不同数据类型,它是来自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
将包含下一个整数的地址(对于16位整数为0x00004002或对于32位整数为0x00004004),但cp
将包含下一个字符(0x00004001)。指针运算依赖于指针的基类型,因此对整数指针的操作将对指向其他类型的指针的操作产生不同的结果。
不同的指针类型可能具有不同的大小。考虑一个字寻址架构,其中存储器的基本单元可以是16位宽,或24或32或36.任何指向占据整个字的类型的指针都是N位宽,但是{{1} }类型需要一些额外的位来指向单词中的特定字符(除非您确定char *
值也应该占据整个单词)。
答案 2 :(得分:1)
没有。 int * x
将x
声明为“指向int
类型对象的指针”类型的变量。
答案 3 :(得分:1)
没有。指针的大小不一定与int
相同。这在某些体系结构中尤为重要,如果您还考虑了函数指针之类的内容。
答案 4 :(得分:1)
撰写int *x
时,没有隐含的任何。 x
是一个指针,但它并不指向任何东西。 x
的类型为int *
。
int * int x
根本不是合法语法。
答案 5 :(得分:0)
学习C时往往会引起混淆的是*
个字符。它实际上有两种完全不同的用途:
您可以使用地址 &
获取变量的指针地址(内存地址),并将其指定给指针变量操作
// 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中无效。