小问题:void func(char *p)中想修改p的值,比如指向"abc",怎么做? char *s="abc";void fun(char *p){ p=s;//不行 p="abc";还是不行}void CTestDlg::OnButton1() { char *p=new char[255]; fun(p); MessageBox(p);}究竟应该怎么做?strcpy肯定是可以的,这个没问题。但是效率肯定不如直接指针指向来的高。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void fun(char *p){ strcpy(p "abc");} 谢谢你的回复但我上面已经说了,不想使用strcpy 如果要直接指向, 用char**fun(char **p){ *p = "abc";} 同意 fun(char **p){ *p = "abc";} void fun(char *p){ if(!p) return; memcpy(p, "abc", 3);这里需要注意p的长度} void fun(char *p){ p=s;//不行 p="abc";还是不行}的问题和void fun(int i){ i = 3;}一样 void fun(char*& p){ p=s;//不行}这样也可以 谢谢楼上的回复,但是为什么前者不行?是不是分配在堆上的指针不能挪动指向?如保参数是*p则而函数内修改p指向的值可以返回主函数。如果改变p的指向,则不有返回p的指向。所以用**p 主要原因是编译器制作了一个副本_p,使得_p = p,你的程序只是改变_p的指向而已,p没动 当然不行!举个例子:char s='s';void func(char p){ p=s;}这样不行吧你的代码跟这个是一个意思你想该char类型参数的值,需要传进来一个char类型的指针同样,你想改一个char*类型的,需要传进来一个char*的指针,也就是char**或者传引用void func(char*& p)不过这样更容易让人晕,比较像考试题..............还有你的p="abc"跟上面说的差不多,但是还有其它问题.你的左值是char*,但是右值是const char*,这样会带来问题的 楼主我不知道你的意图是什么, 不过你的那两行不行的原因:char* s = "abc", 这是一const;那么你想要在你的函数中把p = s;那么你的函数原型:void fun(const char* p)p = "abc";也是当然不行的,应为char* ,你必须先new 然后再把地址给p; fun(char **p){ *p = "abc";}这样用,太危险了吧,如果你还想把*p传出去。比如下面危险的例子:void fun(char **pTemp){ TRACE("s赋值前地址: 0x%.8x\n", *pTemp); *pTemp = "xyz"; //这个时候*pTemp已经指向"xyz"这块常量内存 TRACE("s赋值后地址: 0x%.8x\n", *pTemp);}void CYourDlg::OnOK() { // TODO: Add extra validation here char *s = (char *)malloc(4); strcpy(s, "abc"); TRACE("s将被free的地址: 0x%.8x\n", s); fun(&s); TRACE("s: %s\n", s); if (s) { TRACE("s实际被free的地址: 0x%.8x,我靠,太危险了吧?!\n", s); free(s); s = NULL; } //CDialog::OnOK();}正确的例子:void fun(char **pTemp){ TRACE("s赋值前地址: 0x%.8x\n", *pTemp); strcpy(*pTemp, "xyz"); TRACE("s赋值后地址: 0x%.8x\n", *pTemp);}void CYourDlg::OnOK() { // TODO: Add extra validation here char *s = (char *)malloc(4); strcpy(s, "abc"); TRACE("s将被free的地址: 0x%.8x\n", s); fun(&s); TRACE("s: %s\n", s); if (s) { TRACE("s实际被free的地址: 0x%.8x,没问题!\n", s); free(s); s = NULL; } //CDialog::OnOK();} 四态按钮。 谁学过COM,谁看过《COM技术内幕》,我来发发牢骚 DLL中修改变量的问题《〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈 CTabCtrl得到每页的标题问题! 求助: xp英文版系统, VC6.0英文版IDE ->> VC IDE下中文输入光标不在正确的位置? 关于vc中的头文件../require.h ,请大虾多多指教。 我用Win32写了个简单的程序,如何美化窗口? 关于VC的三个问题 怎样使我的程序只运行一个实例?我用SDK编程的,在WIN2K下,答者有分! 如何在登陆前启动 今天生日,散分. CStatic控件如何挂载图片和显示提示文字呢?
{
strcpy(p "abc");
}
但我上面已经说了,不想使用strcpy
fun(char **p)
{
*p = "abc";
}
{
*p = "abc";
}
{
if(!p)
return;
memcpy(p, "abc", 3);这里需要注意p的长度
}
{
p=s;//不行
p="abc";还是不行
}
的问题和
void fun(int i)
{
i = 3;
}
一样
{
p=s;//不行
}
这样也可以
是不是分配在堆上的指针不能挪动指向?
如保参数是*p则而函数内修改p指向的值可以返回主函数。
如果改变p的指向,则不有返回p的指向。
所以用**p
举个例子:
char s='s';
void func(char p)
{
p=s;
}
这样不行吧
你的代码跟这个是一个意思
你想该char类型参数的值,需要传进来一个char类型的指针
同样,你想改一个char*类型的,需要传进来一个char*的指针,也就是char**
或者传引用
void func(char*& p)
不过这样更容易让人晕,比较像考试题..............
还有你的p="abc"跟上面说的差不多,但是还有其它问题.
你的左值是char*,但是右值是const char*,这样会带来问题的
char* s = "abc", 这是一const;
那么你想要在你的函数中把
p = s;那么你的函数原型:void fun(const char* p)p = "abc";也是当然不行的,应为char* ,你必须先new 然后再把地址给p;
{
*p = "abc";
}
这样用,太危险了吧,如果你还想把*p传出去。比如下面危险的例子:
void fun(char **pTemp)
{
TRACE("s赋值前地址: 0x%.8x\n", *pTemp);
*pTemp = "xyz"; //这个时候*pTemp已经指向"xyz"这块常量内存
TRACE("s赋值后地址: 0x%.8x\n", *pTemp);
}void CYourDlg::OnOK()
{
// TODO: Add extra validation here
char *s = (char *)malloc(4);
strcpy(s, "abc");
TRACE("s将被free的地址: 0x%.8x\n", s); fun(&s);
TRACE("s: %s\n", s); if (s)
{
TRACE("s实际被free的地址: 0x%.8x,我靠,太危险了吧?!\n", s);
free(s);
s = NULL;
} //CDialog::OnOK();
}正确的例子:
void fun(char **pTemp)
{
TRACE("s赋值前地址: 0x%.8x\n", *pTemp);
strcpy(*pTemp, "xyz");
TRACE("s赋值后地址: 0x%.8x\n", *pTemp);
}
void CYourDlg::OnOK()
{
// TODO: Add extra validation here
char *s = (char *)malloc(4);
strcpy(s, "abc");
TRACE("s将被free的地址: 0x%.8x\n", s); fun(&s);
TRACE("s: %s\n", s); if (s)
{
TRACE("s实际被free的地址: 0x%.8x,没问题!\n", s);
free(s);
s = NULL;
} //CDialog::OnOK();
}