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

标签 c pointers

虽然它非常基本并且可能看起来很傻,但我试图了解 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/

    相关文章:

    c - 什么是 pcap、pcap_t、errbuf[PCAP_ERRBUF_SIZE]

    c++ - 参数类型 'void' 不完整

    pointers - 引用与指针的执行速度

    c++ - 如何创建 const 指针的动态数组?

    无法将变量分配给 C 中的外部变量

    c - 在 C 中将指针类型转换为多维数组

    在 C 中将二进制格式字符串转换为 int

    c - 最适合基于前缀的搜索的数据结构

    c++ - 指向指针的 const 问题

    pointers - 如何将接口(interface)实现指针转换为接口(interface)指针?