* p包含什么?

时间:2016-11-26 15:45:07

标签: c pointers dereference

根据多个源,指针p在取消引用时指向一个值。因此,我们可以说指针包含地址作为其值,并且当使用解除引用运算符(*)时,返回地址处的值。 / p>

可以为指针分配如下值:

int a = 90; int *p = &a;

如果我们指定一个指针,它的值如下:

int *p; *p = 60;

60被分配给p并在解除引用时导致未定义的行为,因为60不是有效地址。 (根据the answer to this question)。

但是,对于以下代码:

    int a = 90;
    int *p = &a;

    printf ("p is %d \n",*p);
    printf ("a is %d \n", a);
    printf ("address is %p \n",p);

    *p = 100;

    printf ("p is %d \n",*p);
    printf ("a is %d \n", a);   
    printf ("address is %p \n",p);

收到以下输出:

  

p是90
  a是90
  地址是0028FED8

     

p是100
  a是100   地址是0028FED8

即表达式*p = 100更改a处的值,而不更改p包含的值。

怎么样??????

4 个答案:

答案 0 :(得分:2)

* p =& a甚至无法编译。 p是指向int的指针。它目前有一个未定义的值,因此为* p分配任何内容是未定义的行为,很可能会崩溃。但是,即使p 指向一个int,你只能将一个int赋给* p,而a是一个指向int的指针,而不是一个int,所以这不会编译。

在第二个示例中,* p = 60,p的值未定义,因此您尝试将60存储到内存中的未定义位置。瞬间崩溃。这个没有修改过,所以你的解释是错误的。 p未设置为60.您无法将p设置为int。您只能将其设置为指向int的指针。

正确:

p = &a; 
*p = 60;

答案 1 :(得分:1)

你曾问过:

  

即,表达式* p = 100会更改a处的值,而不是p。

中包含的值

您可以阅读评论部分,了解每行C代码的解释,并且我没有使用确切的地址位置,而是使用任意地址进行演示:

int *p;       // Stack variable pointer to integer type w/ p's address being 4 bytes      @  0x00000000
int a = 90;   // Stack integer variable `a` and initializing it to the value of 90 located @  0x00000040 
*p = &a;      // Dereferencing the pointer `p` to be equal to the address of `a` ... One would think
              // that the address value of `a` 0x00000040 in hex would be stored into `a` which
              // has the value of 64 in decimal, however this is not always the case and this should be 
              // undefined behavior, but can still compile and run depending on the compiler and architecture. 
              // It may run or crash or not even compile or build at all. Most compilers should throw an error.

*p = 100;    // 'p' is located at 0x00000000 and contains the value 0x00000040 and by dereferencing it
             // it will assign the value of 100 to the stack address location of 0x00000040. Thus this
             // changes the value of `a` to 100

             // These two statements are in a sense equivalent  
*p = 100;    a = 100;
             // If one was to assign the address of `a` to `p` as such:
 p = &a;

修改

            // Therefor the statement `*p=100` will only work if the statement
            // `p=&a` is defined and evaluated beforehand.

修改 现在关于基于标题的问题:"what does *p contain?"和提供的原始代码*p实际上包含垃圾或者在声明时分配给它的内容。

答案 2 :(得分:1)

你在开头写的代码:

int *p;
int a = 90;
*p = &a;

无效,第1行中的星号(*)表示它是一个指针,它不是第3行中的解除引用运算符。

以下代码:

int a = 90;
int *p = &a;

相当于:

int a = 90;
int *p;
p = &a;

(p)是指针,现在指向(a)

的地址
*p = 100;

所以,你只需为a,a = 100赋值。 并且您从同一地址打印相同的值。

答案 3 :(得分:0)

  

根据多个来源,指针p在取消引用时指向一个值。

不完全。指针指向一个对象。取消引用指针会生成该对象。在需要值的上下文中使用对象会产生存储的值。

int *p = &a;

p现在指向的对象是a

*p = 100;

解除引用p会生成指向对象,即a。由于这不是需要存储值的上下文,a的值未被读取,因此它仍然是被赋予值a的对象100

或者,简而言之,*p表示a,因此*p = 100表示a = 100