簡體   English   中英

在C ++中將一個指針復制到另一個指針

[英]copying one pointer to other in C++

#include <iostream>

using namespace std;

int main(int argc, char **argv) {
    int a=5;
    int *p,*q;

    *p = a;
    *q = *p;  //line 6

    cout<<*p<<p<<*q<<q;

    return 0;
}

這個程序掛了。 似乎問題出在第6行。為什么會這樣?

是的,那些是懸空指針,你正在遇到未定義的行為。

您不能取消引用指向您不擁有的內存的指針:

int* p;
*p; //illegal

int* x = NULL;
*x; //illegal

int* y = new int;
*y; //OK!

正確的版本是:

int main(int argc, char **argv) {
    int a=5;
    int *p = new int; 
    int *q = new int;

    *p = a;
    *q = *p;  //line 6

    cout<<*p<<p<<*q<<q;

    delete p; 
    delete q;

    return 0;
}

要么

int main(int argc, char **argv) {
    int a=5;
    int *p;
    int *q;

    p = &a;
    q = p;  //line 6

    cout<<*p<<p<<*q<<q;

    return 0;
}

一個更正確的版本:

int main(int argc, char **argv) {
    int a=5;
    int p,q;

    p = a;
    q = p;  //line 6

    cout<<p<<p<<q<<q;

    return 0;
}

沒有指針:)

第5行也有問題。 你已經聲明了指針,但你沒有讓它們指向任何東西,這不會自動發生。 並取消引用未初始化的指針,可能會導致程序崩潰。

像這樣的東西會更好。

int main(int argc, char **argv) {
    int a=5;
    int b, c;
    int *p,*q;

    p = &b; // make p point at b
    q = &c; // make q point at c
    *p = a;
    *q = *p;  //line 6

    cout<<*p<<p<<*q<<q;

    return 0;
}

你所擁有的代碼假定在沒有的情況下存儲在p中的東西。

這是你想要做的嗎?

int a=5;
int *p,*q;

p = &a;
q = p;  //line 6

cout<<(*p)<<p<<(*q)<<q;

在上面的代碼中,在程序結束時,p和q指向相同的地址 - 整數a存儲的地址

可以使用另一個變量復制兩個指針,如下所示

#include<iostream>
using namespace std;


int main()
{
int *p,*q;
int a = 5;
p = &a;
q = &(*p);
a = 10;
std::cout<<*p<<std::endl;
std::cout<<*q<<std::endl;
}

但是在上面的例子中,兩個指針指向的地址不一樣。 這將使得兩個指針都由變量a C ++確定。另一個好方法是使用引用

int a = 5;
int& p = a;
int& q = p;
std::cout<<p<<std::endl;
std::cout<<q<<std::endl;
std::cout<<&p<<std::endl;
std::cout<<&q<<std::endl;

結果:


0xbf9e7498
0xbf9e7498

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM