char *s="abc";void fun(char *p)
{
p=s;//不行
p="abc";还是不行
}
void CTestDlg::OnButton1() 
{
char *p=new char[255];
fun(p); 
MessageBox(p);
}究竟应该怎么做?
strcpy肯定是可以的,这个没问题。但是效率肯定不如直接指针指向来的高。

解决方案 »

  1.   

    void fun(char *p)
    {
    strcpy(p "abc");
    }
      

  2.   

    谢谢你的回复
    但我上面已经说了,不想使用strcpy
      

  3.   

    如果要直接指向, 用char**
    fun(char **p)
    {
          *p = "abc";
    }
      

  4.   

    同意 fun(char **p)
    {
          *p = "abc";
    }
      

  5.   

    void fun(char *p)
    {
       if(!p)
          return;
       memcpy(p, "abc", 3);这里需要注意p的长度
    }
      

  6.   

    void fun(char *p)
    {
    p=s;//不行
    p="abc";还是不行
    }
    的问题和
    void fun(int i)
    {
       i = 3;
    }
    一样
      

  7.   

    void fun(char*& p)
    {
    p=s;//不行
    }
    这样也可以
      

  8.   

    谢谢楼上的回复,但是为什么前者不行?
    是不是分配在堆上的指针不能挪动指向?
    如保参数是*p则而函数内修改p指向的值可以返回主函数。
    如果改变p的指向,则不有返回p的指向。
    所以用**p
      

  9.   

    主要原因是编译器制作了一个副本_p,使得_p = p,你的程序只是改变_p的指向而已,p没动
      

  10.   

    当然不行!
    举个例子:
    char s='s';
    void func(char p)
    {
      p=s;
    }
    这样不行吧
    你的代码跟这个是一个意思
    你想该char类型参数的值,需要传进来一个char类型的指针
    同样,你想改一个char*类型的,需要传进来一个char*的指针,也就是char**
    或者传引用
    void func(char*& p)
    不过这样更容易让人晕,比较像考试题..............
    还有你的p="abc"跟上面说的差不多,但是还有其它问题.
    你的左值是char*,但是右值是const char*,这样会带来问题的
      

  11.   

    楼主我不知道你的意图是什么, 不过你的那两行不行的原因:
    char* s = "abc", 这是一const;
    那么你想要在你的函数中把
    p = s;那么你的函数原型:void fun(const char* p)p = "abc";也是当然不行的,应为char* ,你必须先new 然后再把地址给p;
      

  12.   

    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();
    }