c++指针对指针的赋值

C++ Assign Pointer to Pointer

本文关键字:指针 赋值 c++      更新时间:2023-10-16
#include <iostream>
using namespace std;
void fn(int* input_ptr) {
    int *ptr2 = input_ptr;
    cout << "pointer 2 is " << *ptr2 << endl;
}
int main() {
    int *ptr1;
    *ptr1 = 7;
    fn(ptr1);
}

这个例子有效,当我传递一个指针给函数,并将其赋值给函数内部的临时指针时,结果显示指针2也是7。然而,

#include <iostream>
using namespace std;
int main() {
    int *ptr1;
    *ptr1 = 7;
    int *ptr2;
    *ptr2 = ptr1; // or I have also tried *ptr2 = *ptr1
    cout << "pointer 2 is " << *ptr2 << endl;
}

同样的步骤在main函数中不起作用。我知道你可以使用地址ptr2 = ptr1不带星号,它会工作。

然而,在第一个例子中,我可以直接将指针作为函数参数赋值给带有星号的新指针(或称为解引用?),但在第二个例子中,我不能在main函数中这样做。

有人能帮我解答这个问题吗?谢谢你的宝贵时间。

在这两个例子中,都是对未初始化的指针解引用,这是未定义行为

对于指针赋值问题,可以直接赋值:

 int *ptr2 = ptr2; 
第二个示例中的

,前提是确保ptr1指向有效位置。例如,

int x;
int *ptr1 = &x; /* ptr1 now points to the address of x */
*ptr1 = 7;
int *ptr2;
ptr1 = ptr2;

main中,变量ptr1没有初始化为指向正确分配的内存块。

因此程序的其余部分产生未定义的行为。

这里使用指针的方式存在一个主要问题。直接解引用指针可能会导致usr和barak

建议的未定义行为。

需要使用

为这里的指针分配内存
int* ptr1 = new int[1];

也因为你是分配内存的人,你需要在退出前清理

delete[] ptr1;

如果您不希望使用动态内存分配,您可以将其初始化为

int a = 7;
int* ptr1 = &a;

这样你就不会解引用多余的指针而导致未定义的行为。

关于

的输出
 *ptr1 = ptr2; // or I have also tried *ptr1 = *ptr2

在c++或C中赋值是从右到左的。因此ptr2不会有ptr1的值;

例如

,

int a  = 5;
int b = 6;
a=b;

会使a = 6

反之则

b = a;

将使b = 5