- 论坛徽章:
- 0
|
回复 #30 vbs100 的帖子
谢谢你的建议
我说明一下使用传值意图
首先你上面用的例子比较特殊,不便于说明问题,我在举一个例子
typedef struct _tagabc
{
int n_value;
double d_value;
}abc_t;
这个结构体中不包含指向堆的指针。
插入数据时:
使用传值:
abc_t t_abc = {10, 10.0};
/* 执行插入操作,将t_abc复制 */
/* 第二次插入是可以使用同样一个值 */
t_abc.n_value = 20;
t_abc.d_value = 20.0;
/* 执行插入操作,将t_abc复制 */
使用传地址:
abc_t* pt_abc = (abc_t*)malloc(sizeof(abc_t));
pt_abc->n_value = 10;
pt_abc->d_value = 10.0;
/* 执行插入操作,将pt_abc复制 */
/* 第二次在插入的时候就必须在为这个指针分配内存,因为容器中只是保存了指向内存的指针,并没有复制内存,如果没有为pt_abc分配新的内存就直接修改其值,这样容器中的值也跟着改变了,这对于set_t类的容器来说是致命的错误 */
pt_abc = (abc_t*)malloc(sizeof(abc_t));
pt_abc->n_value = 20;
pt_abc->d_value = 20.0;
/* 执行插入操作,将pt_abc复制 */
这是使用自定义类型的数据,但是要是使用C内部类型那么传地址就更麻烦了。
例如使用int类型
我可以使用4, 8, 298这样的数字文字量来当作参数,传地址就必须如下操作:
int* pn_value = (int*)malloc(sizeof(int));
*pn_value = 4;
/* 执行插入操作,将pn_value复制 */
pn_value = (int*)malloc(sizeof(int));
*pn_value = 8;
/* 执行插入操作,将pn_value复制 */
-----------------------------------------------------------------------------------
取出数据我现在采用的是直接返回指定数据的指针。
-----------------------------------------------------------------------------------
删除数据正像你上面说的一样。
-----------------------------------------------------------------------------------
此为还有当复制容器时
保存值的容器可以很容易就复制了,
但是保存指针的容器复制后两个容器中的指针都是指向一块内存了,当销毁一个容器后另一个容器就无效了。
-----------------------------------------------------------------------------------
现在有事不能继续回复了
晚上再回复,抱歉。 |
|