这个题是这样的!

//

char * p = "1234567890";   和  char p[] = "1234567890"; 的区别;  答: char * p 的内容不可以被修改;
  

//1:

void cpy(char * p )
{

 int nlen = strlen(p);

 char pch[100]/*={0}*/;

 Sleep(1000);

 memcpy(pch, p,nlen);

 AfxMessageBox(pch);
}

 

void CTmfc2Dlg::OnButton1()
{
 // TODO: Add your control notification handler code here

 char * p ="abcdefg";
  cpy(p);

 

  char pch[] = "abcdefg";

  cpy(pch);

}

 

结果是字符串加乱码;如果有人说程序会崩溃,就让他先到VC6上调试完后再说;

 

//2:

/如果有人说这样写就无法得到值或程序崩溃,让他VC6先调试再说;如果说这样有潜在问题是对的;

char *  getstr()

{

  char pch[] = "abcdefg";

}

void CTmfc2Dlg::OnButton2()

   MessageBox(getstr()); //结果正常显示;

 

 

    char * p = getstr(); 

for(int i = 0 ; i<100; i++)

{

MessageBox( p );  //后面的可能会显示乱码字符串;因为 p 指向的getstr函数返回的临时变量,很快就被内存回收;

sleep(100);

}

}

 

 

//3:

//这个题是教训啊:

//求执行结果:

void GetMemory(char*  p, int num)
{
   p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;

GetMemory( str, 100);

 

 strcpy(str, "hello");
 
 AfxMessageBox(str);
}

正确答案:程序崩溃;

解释:参数的传入是一个副本,就是将你要传入的参数copy一个临时的,如上题:

str 传入GetMemory( str, 100);上题相当于:

 

char *str = NULL;

void GetMemory( int num)
{

   char * tempstr = str; //上题中,p 就相当于 tempstr,指向了NULL,而且是另一个变量了,和 char *str = NULL; 中的str是两个不同的内存中的变量都指向null;


   tempstr = (char *)malloc(num); //这是tempstr  指向了一个新的地址空间,而 str还是指向NULL;
}


void Test(void)
{

GetMemory( 100); //因为这里执行后str还是NULL;

strcpy(str, "hello");//所以这里会崩溃;
 
AfxMessageBox(str);
}

综上所述,可以修改GetMemory函数为:

void GetMemory(char**  p, int num) //指向指针的指针,相当于一般变量,传入其指针,改变其内容;
{
   p = (char *)malloc(num);
}

或者

void GetMemory(char* &  p, int num)//传入指针的引用,相当于直接传入指针,相当于一般变量传入引用,相当于直接用参数不copy副本;
{
   p = (char *)malloc(num);
}

 

总结一下:

1: 如果将指针作为一个参数传入函数,直接用指针指向的内容,或修改指针指向的内容,结果正确;如:示例2;没有参数指针指向新的地址空间;

2: 如果将指针作为一个参数传入函数,给传入的指针赋值一个新的地址(既:在函数中,将参数指针指向新的地址,如new一个新的空间赋值给参数指针),

                                                          参数指针函数外部的指针内容是没有变化的;

                                                          如果想通过参数改变外部变量的值,就要通过外部值的指针或引用;(如果外部值是指针,就要用指针的指针或指针的引用);如:示例1;

 

示例1:改变参数指针指向的内容:

void setvalue(char* p)
{
 char pch[] = "abcdefg";

 p = pch;

 AfxMessageBox(p);
}

void test()
{

//char * p = "1234567890";
char p[] = "1234567890";

 setvalue(p);

 AfxMessageBox(p);
}

两个显示是不一样的; 想修改 char p[] 的内容,就要将setvalue(char* p)改为setvalue(char** p)或setvalue(char* & p);

 

 

示例2:改变指针指向的内容:

void setvalue1(char* pstr)

 memcpy(pstr,"abcdefg", strlen("abcdefg"));  //memcpy(pstr,"abcdefg", sizeof("abcdefg")); 结果不同,sizeof结果+1,copy了字符串结束符“\0”;
 
 AfxMessageBox(pstr);
}

void test()
{
 char p[] = "1234567890";

 setvalue1(p);

 AfxMessageBox(p);
}

 



 

void setvalue1(char* pstr)

 memcpy(pstr,"abcdefg", strlen("abcdefg"));  //memcpy(pstr,"abcdefg", sizeof("abcdefg")); 结果不同,sizeof结果+1,copy了字符串结束符“\0”;
 
 AfxMessageBox(pstr);
}

void test()
{
 char p[] = "1234567890";

 setvalue1(p);

 AfxMessageBox(p);
}

 

 

 

 

你可能感兴趣的:(null)