|
|
发表于 2008-4-30 19:24:00
|
显示全部楼层
Re: Re:关于函数指针和共用体的问题
funcman: Re:关于函数指针和共用体的问题
考虑到和C语言的兼容,const char*是可以赋值给char*的。所以上面那位同学的理解和实际情况还是有些偏差的。
LZ在字符指针指向字符串常量的操作上没什么问题。
const char *cstr = "1234";
char *str = cstr ;
//error C2440: “初始化”: 无法从“const char*” 转换为“char*"
//这里可以编译通过的话 你就可以直接修改const常量了
//char *str = (char *)cstr; 这样的话编译器为你产生匿名变量(明确说是字符数组,下同),,编译通过
为什么初始化和参数赋值可以通过?
void print(char *str){}
print("123");
//编译通过
//其实这里会产生临时变量,str指向的是编译器生成的匿名变量
初始化操作也是同样的道理..
struct STRING
{
char *m_name;
};
STRING strings[] = {"1234", "5678"};
编译器都会产生临时变量,你指向其实是编译器的匿名变量
楼主的字符串初始化的确没问题,结构中的char *指针会指向编译器为你生成匿名
变量,并储存在公共变量区
备注:早期c\c++编译器可能无法通过编译,因为这样会隐式产生匿名变量,不过这样
可以方便好多.
const char cstr[] = "1234";可以看成 const char cstr[] = {'1','2','3','4'};
但是 const char *cstr[] = "1234"; 和 const char *cstr = {'1','2','3','4'}; 后者会编译错误,这里可以看出const char* cstr = "1234"的特殊性.
其实编译器先会生成一个匿名字符数组存放"1234",然后把这个数组的地址赋值给cstr.
|
|