“给函数传入指针只是指针的副本”

太恶心了,今天居然被我碰上教科书上念叨的“给函数传入指针只是指针的副本”的问题,程序在下边(建立打印二叉树),程序写得很清晰明了,但是有一处小错误,谁找得出:

#include <iostream>
using namespace std;


class Node
{
public:
char m_data;
Node *m_left, *m_right;


Node( char data, Node *left = NULL, Node *right = NULL)
{
m_left = left;
m_right = right;
m_data = data;
}
};


class BTree
{
Node *m_root;


public:
BTree(Node *root = NULL)
{
m_root = root;
}


Node * Root()
{
return m_root;
}


void Create(Node *&p)
{
cout << "Please input a char, end input with '#'" << endl;
   char ch;
cin >> ch;
if('#' != ch)
{
p = new Node(ch);
Create(p-> m_left);
Create(p -> m_right);
}
}


void Create()
{
Create(m_root);
}


void Print(Node *p)
{
if(p != NULL)
{
cout << p -> m_data;
Print(p -> m_left);
Print(p -> m_right);
}
}


void Print()
{
Print(m_root);
}


/* void Clear(Node *p)
{
if(p != NULL)
{
Clear(p -> m_left);
Clear(p -> m_right);
delete p;
}
}*/


~BTree()
{
// Clear(m_root);
}
};


void main()
{
BTree btr;
btr.Create();
btr.Print();
}

### C/C++ 中通过函数传入指针参数并赋值的实现方法 在 C/C++ 编程中,当需要通过函数修改外部变量的内容时,通常会使用指针作为参数。这是因为指针可以指向内存中的具体位置,从而允许函数内部的操作影响到外部的数据。 #### 方法一:直接传递指针 如果目标是指向某个已存在的对象,则可以通过简单地将该对象的地址传递给函数来完成操作。例如: ```cpp void setValue(int* ptr) { *ptr = 42; // 修改指针所指向的值 } int main() { int value = 0; setValue(&value); std::cout << "Value after function call: " << value << std::endl; // 输出应为42 } ``` 上述代码展示了如何利用指针间接修改实参的值[^1]。 #### 方法二:传递指针指针 (Pointer to Pointer) 然而,有时候不仅希望更改由指针指向的对象本身,还可能想要重新分配一个新的对象或者调整指针本身的指向。此时就需要采用双重指针技术——即让形参成为另一个指针类型的指针。 考虑下面的例子: ```cpp void reassignPointer(int** pp) { static int newValue = 88; // 使用静态局部变量保持生命周期直到程序结束 *pp = &newValue; // 将新的整数值地址赋予原始指针 } int main(){ int initialVal=77,*p=&initialVal; printf("Before:%d\n",*p); reassignPointer(&p); printf("After :%d\n",*p); // 应打印出88 } ``` 这里`reassignPointer()`接受的是一个指向指针指针(`int**`),这样就可以安全地改变原来那个普通指针(p)实际指向的位置[^3]。 #### 动态库(DLL/SO)场景下的应用 另外,在涉及动态链接库(Dynamic Link Library, DLL 或 Shared Object, SO 文件)的情况下,也需要借助于函数指针的概念去加载和调用这些库内的功能接口。比如Windows平台下常用LoadLibrary/GetProcAddress组合方式;Linux则对应dlfcn.h头文件里的dlopen/dlsym API组。这同样涉及到正确设置好相应类型签名后的函数指针实例化过程[^4]。 综上所述,无论是基本数据结构还是高级特性如插件机制开发等领域里,“经由函数入口处给予适当修饰符限定之后”的指针都是极其重要且灵活多样的工具之一!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值