C中声明指针变量时写“*”的目的是什么?

问题描述 投票:0回答:1

我正在学习 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).

我的问题是,鉴于程序似乎输出正常,它有什么不高兴的,为什么不高兴?变量声明中的“*”到底有什么作用?

c pointers
1个回答
1
投票
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 教科书中处理指针的章节中对此进行了解释。

© www.soinside.com 2019 - 2024. All rights reserved.