gpt4 book ai didi

c - int *ptr= 5 怎么做;与 int *ptr= 变量地址不同?

转载 作者:行者123 更新时间:2023-12-03 23:27:36 25 4
gpt4 key购买 nike

虽然它非常基本并且可能看起来很傻,但我试图了解 int *ptr = 45 之间的区别是什么或 0xc8750; (一些数字)与 int *ptr= &a; (变量地址)。

我已经知道的是:

  • 指针用于存储变量的地址并修改指向变量的内容(但我想知道如何实现)
  • 在后一种情况下,我可以分配 *ptr到合法的不同地址。
  • 但是,在第一种情况下它是非法的!。

  • 如果地址/数字都是整数,为什么后者是非法的?
    将它们存储在内存中时,它们的处理方式有何不同?

    我有两段代码/程序基本上可以突出显示相同的内容:

    案例 1:
    #include <stdio.h>

    int main()
    {
    int *ptr = 0xc42; // is this stored in read only memory?!! which later leads to seg faults in further assignments?!
    *ptr = 45; //illegal leads seg fault.
    return 0;
    }

    案例 2:
    int main()
    {
    int a=10, b=20;
    int *ptr = &a; // is here get any special treatment and object will be created for *ptr!!!
    *ptr = &b; //legal
    printf(" *ptr = %d \n", *ptr);
    *ptr = 20; //legal !!
    printf(" *ptr = %d \n", *ptr);
    *ptr = 50; //legal
    printf(" *ptr = %d \n", *ptr);
    return 0;
    }

    正如我们所看到的 *ptr = 20*ptr = 50合法且罚款! (没有段错误)。

    为什么是 int *ptr = 0xc989 的这个分配或 5 个不同于 int *ptr = &variable ?.

    最佳答案

    让我们从基础开始:指针是包含指向给定类型数据的地址的变量。如果我们声明

    datatype* foo;
    foo (当前未初始化)将包含类型为 datatype 的变量的地址。 ,并尊重它
    *foo = ...;

    我们正在访问该地址并将其值存储在那里。

    在这两种情况下,我们都有 * foo ,但它们不一样!
  • 在第一种情况下,星号指的是 datatype .变量类型为 datatype * ;变量名是 foo . foo包含地址。
  • 在第二种情况下,我们取消引用地址,以便访问它。星号指的是为了执行指针解除引用的变量。


  • 所以,当你写
    int *ptr = 0xc42; // is this stored in read only memory?!!
    // which later leads to seg faults in further assignments?!
    *ptr = 45; //illegal leads seg fault.
  • int *ptr = 0xc42;你对编译器说你声明了一个名为 ptr 的变量, 类型 int *并且其第一个值是 0xC42 . ( 注意: 由用户正确说明 Lundin ,此分配需要进一步强制转换才能成为有效的 C)。
  • *ptr = 45;您正在访问 ptr 指向的地址并赋值 45 .合法吗?好吧,如果您之前分配了一个有效地址(一般来说,如果您使用 & 运算符将另一个变量的地址分配给一个指针,例如 int *ptr = &a; )。但是如果你给它分配一个随机整数......它可能会导致段错误。
  • 关于c - int *ptr= 5 怎么做;与 int *ptr= 变量地址不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60752408/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com