数组char *a[]=“hello”;
指针char *p=“hi”;
a是整个char的首地址,是个常量!对a的赋值是错的!只可以对其内容进行改变!
且sizeof(a)=6;
a大小固定为6,不可再改变了!
注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
不论数组 a 的容量是多少,sizeof(a)始终等于 sizeof(char *)。
其实质是void Func(char a[100])
{
cout<< sizeof(a) << endl; // 4 字节而不是 100 字节
}
p是个地址的变量,它可以改变!sizeof(p)=2;
char *q="what";
p=q;
则p地址(=q地址)指向了q地址内容!
不可单独对p[2]......赋值!
..........................完善中............................
指针的赋值注意:不能调用函数参数进行指针的赋值,调用参数都是局部变量,退出便释放了!
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100); // str 仍然为 NULL
strcpy(str, "hello"); // 运行错误
}
如上str依旧==NULL
若真要用就用函数返回值进行,如下: 但注意,char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num); //
//林锐 博士 在其编的 高质量编程指南中说: char p[]="hello";栈内存不行!返回指针但没有内容!!!!
不要用栈内存的返回地址,如上例道理一样,因为该内存在函数结束时自动消亡
//((((((但我试过是可以的,也就是Tset3中str=“hello”中这里请看过的读者自己试试,愿意交流!)))))))))
//
//又试了下,,,str指向的内存中是已经没有值了!!!用cout ,printf,memcpy能发现没有值了
return p;
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str, "hello");
cout<< str << endl;
free(str);
}