我正在学习 C 中的指针,并且我了解指针变量是类型化的,以便程序知道在取消引用变量时要读取多少字节,例如
#include <stdio.h>
int main()
{
int x = 1025; // ints are assigned 4 bytes, hence 00000000 00000000 00000100 00000001
int *p = &x; // address of x in memory
char *p0 = (char *)p; // will have the same value as p does, i.e. &x
printf("%d\n", *p); // reads four bytes, returns 1025
printf("%d\n", *p0); // reads one byte, returns 1
return 0;
}
我的理解是,
int
的int *p
部分是告诉程序解引用时要读取多少字节的内存。但是,*
部分有什么作用呢?当我尝试 int p = &x;
时,我收到某种警告,但程序似乎仍然有效。指令 int p = &x;
与 int *p = &x;
有何不同,C 不喜欢它的什么?
我尝试了以下方法:
#include <stdio.h>
int main()
{
int x = 1025;
int p = &x; // No "*"
char p0 = (char *)p; // Ditto
printf("%d\n", *p);
printf("%d\n", *p0);
return 0;
}
我在 VS Code 中,Bash 终端似乎输出没问题:
1025
1
[1] + Done
而 C/C++ gcc 窗口给出错误:
Starting build...
In function 'main':
7:11: warning: initialization of 'int' from 'int *' makes integer from pointer without a cast [-Wint-conversion]
7 | int p = &x;
| ^
8:13: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
8 | char p0 = (char *)p;
| ^
8:13: warning: initialization of 'char' from 'char *' makes integer from pointer without a cast [-Wint-conversion]
10:18: error: invalid type argument of unary '*' (have 'int')
10 | printf("%d\n", *p);
| ^~
11:18: error: invalid type argument of unary '*' (have 'int')
11 | printf("%d\n", *p0);
| ^~~
Build finished with error(s).
我的问题是,鉴于程序似乎输出正常,它有什么不高兴的,为什么不高兴?变量声明中的“*”到底有什么作用?
1 int x = 1025;
2 int p = &x; // No "*"
3 char p0 = (char *)p;
4 printf("%d\n", *p);
在第 2 行中,您尝试将
x
的内存地址填充到 int
中,但根据您的平台,内存地址可能不适合 int
。通常,如果您使用的是 64 位平台(现在很可能),则内存地址需要 64 位,并且还取决于平台,int
可能仅为 32 位。
第 3 行同上,除了
char
根据定义是 always 8 位。
第 4 行中
*p
没有意义,因为 p
是 int
而不是指向 int
的指针。
这是非常基本的 C 知识,在 C 教科书中处理指针的章节中对此进行了解释。