【问题标题】:Printing Pointer Data with Printf in C在 C 中使用 Printf 打印指针数据
【发布时间】:2017-01-31 19:14:56
【问题描述】:

我的理解是,当你声明一个指针时,比如int *a = 5a 是指针,*a 是指向的 int - 所以* 表示你正在访问指针数据。 (而& 正在访问该地址)。希望这是正确的吗?

为什么当我在做printf 时它似乎没有按我想要的方式工作?

int main()
{
    int *a = 5;
    printf("%d\n",a);
    return 0;
}

这给了我正确的结果,这是我没想到的。当我在 printf 中执行 *a 而不是 a 时,它失败了,我对此感到困惑?

【问题讨论】:

  • 这被称为 undefined 行为是有原因的。 printf 手册页如何打印指针你不明白吗?并回顾一下指针和初始化器。
  • 正确的结果,没想到”到底是什么意思?
  • 您是否对指向地址为 5 的 int 5aa 感兴趣?
  • 这样做的目的是我对指针感到困惑,我只是在学习。但是从答案+一些阅读中,我想我得到了语法和它现在的含义。
  • 我以为int *a = 5*a 的值是5,但这不是声明的工作方式,而且我需要先初始化ptr,这是我的错误。

标签: c pointers initialization printf


【解决方案1】:

不,int *a = 5; 不会将 int 的值 5 存储到 a 指向的内存位置,内存位置本身是 5(这大部分是无效的)。这是一个初始化语句,它将int *(一个指针)类型的变量a初始化为5

为便于理解,请考虑以下有效案例

int var = 10;
int *ptrVar = &var;

这里,ptrVar 被赋予了指针&var。因此,换句话说,ptrVar 指向一个包含int 的内存位置,并且在取消引用ptrVar 时,我们将获得int 值。

也就是说,总的来说,

  printf("%d\n",a);

是对undefined behavior 的邀请,因为您将指针类型作为参数传递给%d 格式说明符。

【讨论】:

  • 谢谢,我现在意识到了错误,并且我得到了它的工作。有没有办法让*ptrVar等于10而不先做int var = 10
【解决方案2】:

声明int *a 确实声明a 是一个指针。因此,声明

int *a = 5;

用值 5 初始化 a。就像这样

int i = 5;

将使用值 5 初始化 i

在极少数情况下,您希望使用文字值(0 或 NULL 除外)初始化指针变量。这些可能是嵌入式(或其他深奥的)应用程序,其中某些地址在特定平台上具有定义的含义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 2021-04-04
    • 2021-01-12
    • 1970-01-01
    • 2021-12-29
    • 2023-03-12
    • 2022-11-26
    • 2014-10-25
    相关资源
    最近更新 更多