C ++中的指针(需要概述)

时间:2017-11-14 06:24:35

标签: c++ pointers

int firstvalue = 5, secondvalue = 15;
int * p1, * p2;

p1 = &firstvalue;  
p2 = &secondvalue; 
*p1 = 10;    //line 1      
*p2 = *p1;  //line 2       
 p1 = p2;   //line 3        
*p1 = 20;          

cout << "firstvalue is " << firstvalue << '\n';
cout << "secondvalue is " << secondvalue << '\n';
return 0;

我对此代码的分析: p1指向第一个值,p2指向第二个值。现在,p1指向值10.我的第一个问题是:

这是否意味着第一个值现在存储10.(第1行)

据我所知,第2行意味着p2和p1指向存储在第二个值的地址处的值。我是对还是错?

最后,我对第3行没有任何线索。所以,也需要一些帮助。

6 个答案:

答案 0 :(得分:0)

答案1:p1仍指向firstValue,但firstValue的值现在更改为10 答案2:在第2行中,secondValue被赋值为firstValue。 答案3:第3行将secondValue的指针分配给p1,因此* p1中的任何更改都将反映在secondValue的更改值中。

希望这有帮助。

答案 1 :(得分:0)

  • 这是否意味着第一个值现在存储10.(第1行)

  • 第2行表示p2和p1指向存储在第二个值的地址中的值。

没有。这意味着值p2指向获取p1指向的值的副本。这相当于说secondvalue = firstvalue;,因为p2指向secondvaluep1指向firatvalue,而*指向*p1或者在此上下文中*p2访问指针指向的值。

  • 我对第3行没有任何线索。

这表示p1现在指向p2指向的同一个地方。因此,p1p2都指向secondvalue

答案 2 :(得分:0)

忘记一秒钟的语法并思考这些对象是什么。 内存位置恰好有两个属性,位置和内容。

int firstvalue;保留一个内存位置(它的大小在这里无关紧要)。 firstvalue = 5;在那里存储一个值。

firstvalue是与内存地址关联的标签,&amp; firstvalue是该地址。 指针是一个包含地址的变量,用&#39; *&#39;解除引用。为您提供该地址的内容。

所以现在

var newfeeds = [{
  content: 'first'
}, {
  content: 'second'
}, {
  content: 'third'
}];

console.log(
   0 in newfeeds
);
console.log(
   2 in newfeeds
);
console.log(
   3 in newfeeds
);

/* So what you can use is */
var index_key = 1;
if(index_key in newfeeds){
    console.log(newfeeds[index_key].content);
}else{
   console.log(index_key + ' no such index');
}

var index_key = 3;
if(index_key in newfeeds){
    console.log(newfeeds[index_key].content);
}else{
   console.log(index_key + ' no such index');
}

好吗?

答案 3 :(得分:0)

让我们理解什么是指针 - 指针是存储的地址,它根据它不存储值本身让我们逐行分析代码

1)第1行 - 定义了两个变量(保持值的空间)

2)第2行 - 定义了两个指针(保持地址的空间)

3)第4行&amp; 5 - 为指针p1和amp指定变量的变量地址。 p2现在p1指向存储值5的位置,p2指向存储15的位置

4)第6行 - 值10存储在p1指向的位置这意味着变量firstvalue的值从5变为10

5)第7行 - p1指向的位置值被复制到p2指向的位置。现在,firstvalue和secondvalue都是相同的,即10

6)第8行 - p2指针的值(它是第二值变量的地址)被分配给p1。现在p1和p2都指向第二值变量

7)第9行 - 将指定值20赋值给指针p1指向的位置,该指针现在是第二个值变量

结果 - 两个输出都显示值20,因为两个指针现在指向第二个值变量,并且在第9行更新为20

答案 4 :(得分:0)

你去......

#include <iostream>
using namespace std;

int main()
{
    int firstvalue = 5, secondvalue = 15;
    int * p1, *p2;

    p1 = &firstvalue;
    p2 = &secondvalue;
    cout << "firstvalue address: ," << &firstvalue << "p1 address: ," << p1 << "p1 Value " << *p1 << endl;
    *p1 = 10;    //line 1      
    *p2 = *p1;  //line 2 
    cout <<  "p1 Value " << *p1 << "p2 Value " << *p2 << endl;
    p1 = p2;   //line 3        
    cout << "p1 address: ," << p1 << "p2 address: ," << p2 << endl;
    *p1 = 20;
    cout << "p1 value: " << *p1 << endl;


    return 0;
}

输出:

第一个值地址:0115FA74,p1地址:0115FA74,p1值5

p1值10,p2值10

p1地址:0115FA68,p2地址:0115FA68

p1值:20

答案 5 :(得分:0)

很抱歉,但您的分析不正确。

从代码的第一部分开始

int firstvalue = 5, secondvalue = 15;
int * p1, * p2;

p1 = &firstvalue;  
p2 = &secondvalue;

和你的分析

  

p1指向第一个值,p2指向第二个值。

您的分析大致正确。我将给出更完整的描述。

p1int *类型的变量(i.r.指向int的指针)。作业p1 = &firstvaluep1的值指定为变量firstvalue的地址。这有时被认为意味着指针p1被指定为指向firstvalue

相同的说明适用于p2secondvalue

现在,为下一个声明

*p1 = 10;    //line 1  

和你的分析

  

现在,p1指向值10。

这是不正确的。 p1未指向值10

声明*p1 = 10将值10分配给*p1的结果。 *p1是对p1点的引用,其中(如上所述)为firstvalue。因此,作业*p1 = 10具有将firstvalue分配给值10的效果。

这给我们带来了你的第一个问题(尽管你没有问号就写了一个问题)。

  

这是否意味着第一个值现在存储10.(第1行)

如果通过&#34;第一个值&#34;你的意思是&#34;名为firstvalue&#34;的变量,这里的答案是&#34;是&#34;。

现在,我们来看下一个代码声明

*p2 = *p1;  //line 2    

和你的分析

  

据我所知,第2行意味着p2和p1指向存储在第二个值的地址处的值。我是对还是错?

你完全错了。

为了更好地理解,让我们将声明分成几部分。 *p1获取对p1指向的变量的引用 - firstvalue(其值为10)。 *p2获取p2指向的变量的引用 - 即secondvalue。因此,作业*p2 = *p1secondvalue = firstvalue具有相同的效果。

p1仍指向(包含地址)firstvalue。同样,p2仍指向secondvalue。变量firstvaluesecondvalue都具有值10

现在我们来到第3行

p1 = p2;   //line 3  

你对它的观察

  

最后,我对第3行没有任何线索。所以,也需要一些帮助。

你好。

p2是一个指针,其值为&secondvalue - secondvalue的地址。作业p1 = p2p1的值指定为等于p2的值。这意味着p1p2都包含值&secondvalue。 (或者指针p1p2都指向secondvalue)。

结果是

*p1 = 20;

具有将secondvalue指定为值20的效果。 firstvalue未受影响,仍然包含值10