c++指针对指针的赋值
C++ Assign Pointer to Pointer
#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
相关文章:
- 错误:在为指针赋值时,void值没有被忽略
- 关于 c++ 函数中指针赋值的简单问题
- 链表指针赋值为什么我们不能直接将尾巴分配给 temp 而不是尾巴>尾巴下一个
- 为什么通过指针赋值常量没有效果?
- 复制构造函数中的指针赋值
- C++ 指针赋值运算符重载(不仅是对象赋值,还有指针赋值)
- 从字符串数组打印其中一个字符串时出现空指针赋值错误
- 为字符串指针赋值
- 动态指针赋值c++
- std::wstring指针赋值C++
- C++匿名结构指针赋值
- 为指针赋值而不赋值
- 此指针赋值应生成段错误
- 指向指针赋值的指针
- 哪个指针赋值更好(C++)
- <T>unique_ptr.get() 方法在使用原始指针赋值时调用析构函数?
- 为用soap_alloc创建的std::string指针赋值
- 为什么函数头的更改会导致指针赋值不起作用
- 64位c++指针赋值
- 在函数中将指针赋值到不同的地址