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