if(m_str=="") 能不能用m_str==NULL代替,真的很模糊。
另外MFC函数中没有用的可以用NULL代替,可这些MSDN有时又没直接说明,真的不知道这参数该怎么写上去。
一般你们碰见问题怎么解决
21 个解决方案
#1
"" 一般是指字符串
NULL 一般用于地址
NULL 一般用于地址
#2
NULL就是个字节值,里面放着0X00,如果你把他看做字符的话,就是字符的结束符.
#3
CString 有 IsEmpty判断为空。
#4
如果从机器角度来看都是绝对 0 ,
NULL 一般是 头文件中#define NULL 0;(你看不到的)
NULL 一般是 头文件中#define NULL 0;(你看不到的)
#5
NULL一般用于给指针赋值为空,""指空字符串
#6
NULL 主要用于指针,表示空的
"" 主要用于字符串
"" 主要用于字符串
#7
NULL 主要用于指针,表示空的
"" 主要用于字符串
没错
"" 主要用于字符串
没错
#8
NULL 主要用于指针,表示空的
"" 主要用于字符串
=========
这种不够说服力.那指针还可以用0呢.
好像这个东西也比较难说清楚,
以前老师说是:NULL就是什么也没有,""呢,有个空.
呵呵
"" 主要用于字符串
=========
这种不够说服力.那指针还可以用0呢.
好像这个东西也比较难说清楚,
以前老师说是:NULL就是什么也没有,""呢,有个空.
呵呵
#9
CString m_str;
显然m_str是一个对象了
用m_str 和 NULL 进行比较,虽然语法上是可以,但是肯定不对
运行会出错误的
CString重载了 == 符号
if ("" == m_str ) 这个比较是对的
显然m_str是一个对象了
用m_str 和 NULL 进行比较,虽然语法上是可以,但是肯定不对
运行会出错误的
CString重载了 == 符号
if ("" == m_str ) 这个比较是对的
#10
NULL是指针的无效值,""是一个有效的字符串
char *p = NULL; //p指针是NULL,无效,没有分配内存,p的值就是0,*p错误
char *c = ""; //c指针指向一块内存,c指针是有效的,内存里面就放了一个'\0',或者说就是0,c的值是一个地址,*c == ""
p = ""; //由于p没有分配内存,这是错误的
c = NULL; //现在c指针也无效了。内存中本来c地址的那块就成了内存漏洞
char *p = NULL; //p指针是NULL,无效,没有分配内存,p的值就是0,*p错误
char *c = ""; //c指针指向一块内存,c指针是有效的,内存里面就放了一个'\0',或者说就是0,c的值是一个地址,*c == ""
p = ""; //由于p没有分配内存,这是错误的
c = NULL; //现在c指针也无效了。内存中本来c地址的那块就成了内存漏洞
#11
这样吧
char * p1 = "";
char * p2 = NULL;
这两个函数运行完了,你看他们的变量有何区别
两者显然是不同的,前者还是有空间的,而后者则是0
"" 它是一个长度为0的字符串
NULL是一个空指针
他们不同
char * p1 = "";
char * p2 = NULL;
这两个函数运行完了,你看他们的变量有何区别
两者显然是不同的,前者还是有空间的,而后者则是0
"" 它是一个长度为0的字符串
NULL是一个空指针
他们不同
#12
NULL 主要用于指针,表示空的
"" 主要用于字符串
---------------------------
没错。
null 主要用于指针,表示空的,但是什么是空的呢,在面向对象的程序设计里,如果把null衍生到现实问题中,个人理解它表示还没有确定的值。例如:如果你用一个量来表示某种物品的价格,如果这个量是null的话,表示价格还没有确定。并不代表什么都没有。
"" 这个就是一个空串。
"" 主要用于字符串
---------------------------
没错。
null 主要用于指针,表示空的,但是什么是空的呢,在面向对象的程序设计里,如果把null衍生到现实问题中,个人理解它表示还没有确定的值。例如:如果你用一个量来表示某种物品的价格,如果这个量是null的话,表示价格还没有确定。并不代表什么都没有。
"" 这个就是一个空串。
#13
当我们用正面的语句声明CString对象的时候:
CString str1,str2;
系统在内存中为我们分配的两个CString对象(每个占4个字节),你用下面语句一看便知:
cout<<&str1<<endl;
cout<<&str2<<endl;
这里可近似理解成一个指向char*字符数组首地址的指针。
现在回到你的问题中来,m_str==NULL相当把这个指针清零,不指向任何地址;而m_str==""表示指向一个空字符串数组的首地址,虽然为空串,但这时的m_str指向的地方是一个实实在在的字符串的首地址。
CString str1,str2;
系统在内存中为我们分配的两个CString对象(每个占4个字节),你用下面语句一看便知:
cout<<&str1<<endl;
cout<<&str2<<endl;
这里可近似理解成一个指向char*字符数组首地址的指针。
现在回到你的问题中来,m_str==NULL相当把这个指针清零,不指向任何地址;而m_str==""表示指向一个空字符串数组的首地址,虽然为空串,但这时的m_str指向的地方是一个实实在在的字符串的首地址。
#14
要停电了,明天再说。这时0:00停电-_-
#15
为避免楼主受其它回答干扰,引用下面回答,我觉得这个回答最清晰好理解
happy__888([顾问团]寻开心)
这样吧
char * p1 = "";
char * p2 = NULL;
这两个函数运行完了,你看他们的变量有何区别
两者显然是不同的,前者还是有空间的,而后者则是0
"" 它是一个长度为0的字符串
NULL是一个空指针
他们不同
happy__888([顾问团]寻开心)
这样吧
char * p1 = "";
char * p2 = NULL;
这两个函数运行完了,你看他们的变量有何区别
两者显然是不同的,前者还是有空间的,而后者则是0
"" 它是一个长度为0的字符串
NULL是一个空指针
他们不同
#16
NULL指地址0x00000000,而 "" 指字符串 "\0" .
#17
用isEmpty()判断
#18
问个有趣的问题:"",空字串占多少字节呢.
如果是0字节,就是说没有分配空间,那么CString *P="";时, 虽然这完全合法,但指针这时指到什么地方去了.
如果是0字节,就是说没有分配空间,那么CString *P="";时, 虽然这完全合法,但指针这时指到什么地方去了.
#19
int main(int argc, char* argv[])
{
char *str;
char *str2;//str=str2=0xcccccccc(刚申请的指针,只要没初始化都指向0xcccccccc)
str=new char(5); //str=0x00341000,*str=随机数(乱码)
str="name"; //str=0x00422fb4, str+1=0x00422fb5, *(str+1)="ame",
//(原开辟的内存没有用到,又开辟了一段)
//若用原来开辟的内存则用strcpy(str,"name");
//*str='n'('n'的ASCII码值为110)
//*(str+1)='a' *(str+2)='m' *(str+3)='e' *(str+4)=''(''的ASCII码值为0)
//*(str+5)='' *(str+6)=''(没有开辟的都为'',即'\0') str+4=0x00422fb8
str2="zhang"; //str2=0x422fac *str2='z' *(str2+4)='g' *str(str2+5)='' *(str+8)='n' "name"中的n
//可见分配内存时先分配的变量在内存的高地址,但字符串的首在低字节,尾在高字节,
//"name"长4 从0x00422fb4到0x00422fb8
//"zhang"长5 从0x00422fac到0x00422fb3(共8位后3位都为'\0')
str=NULL; //str=0x00000000,NULL是指向0x00000000的指针,任何类型的指针都可赋值为NULL
printf("Hello World!\n");
return 0;
}
{
char *str;
char *str2;//str=str2=0xcccccccc(刚申请的指针,只要没初始化都指向0xcccccccc)
str=new char(5); //str=0x00341000,*str=随机数(乱码)
str="name"; //str=0x00422fb4, str+1=0x00422fb5, *(str+1)="ame",
//(原开辟的内存没有用到,又开辟了一段)
//若用原来开辟的内存则用strcpy(str,"name");
//*str='n'('n'的ASCII码值为110)
//*(str+1)='a' *(str+2)='m' *(str+3)='e' *(str+4)=''(''的ASCII码值为0)
//*(str+5)='' *(str+6)=''(没有开辟的都为'',即'\0') str+4=0x00422fb8
str2="zhang"; //str2=0x422fac *str2='z' *(str2+4)='g' *str(str2+5)='' *(str+8)='n' "name"中的n
//可见分配内存时先分配的变量在内存的高地址,但字符串的首在低字节,尾在高字节,
//"name"长4 从0x00422fb4到0x00422fb8
//"zhang"长5 从0x00422fac到0x00422fb3(共8位后3位都为'\0')
str=NULL; //str=0x00000000,NULL是指向0x00000000的指针,任何类型的指针都可赋值为NULL
printf("Hello World!\n");
return 0;
}
#20
我来回答这个问题:
问个有趣的问题:"",空字串占多少字节呢.
如果是0字节,就是说没有分配空间,那么CString *P="";时, 虽然这完全合法,但指针这时指到什么地方去了.
空串占一个字节,这个字节的内容是0x00
问个有趣的问题:"",空字串占多少字节呢.
如果是0字节,就是说没有分配空间,那么CString *P="";时, 虽然这完全合法,但指针这时指到什么地方去了.
空串占一个字节,这个字节的内容是0x00
#21
可以通过这种方式测试一下:
int main()
{
char str1=""; //设置断点看str1的值
char str2=""; //设置断点看str2的值
char str3=""; //设置断点看str3的值
char str4=""; //设置断点看str4的值
printf("hello world!");
return 0;
}
int main()
{
char str1=""; //设置断点看str1的值
char str2=""; //设置断点看str2的值
char str3=""; //设置断点看str3的值
char str4=""; //设置断点看str4的值
printf("hello world!");
return 0;
}
#1
"" 一般是指字符串
NULL 一般用于地址
NULL 一般用于地址
#2
NULL就是个字节值,里面放着0X00,如果你把他看做字符的话,就是字符的结束符.
#3
CString 有 IsEmpty判断为空。
#4
如果从机器角度来看都是绝对 0 ,
NULL 一般是 头文件中#define NULL 0;(你看不到的)
NULL 一般是 头文件中#define NULL 0;(你看不到的)
#5
NULL一般用于给指针赋值为空,""指空字符串
#6
NULL 主要用于指针,表示空的
"" 主要用于字符串
"" 主要用于字符串
#7
NULL 主要用于指针,表示空的
"" 主要用于字符串
没错
"" 主要用于字符串
没错
#8
NULL 主要用于指针,表示空的
"" 主要用于字符串
=========
这种不够说服力.那指针还可以用0呢.
好像这个东西也比较难说清楚,
以前老师说是:NULL就是什么也没有,""呢,有个空.
呵呵
"" 主要用于字符串
=========
这种不够说服力.那指针还可以用0呢.
好像这个东西也比较难说清楚,
以前老师说是:NULL就是什么也没有,""呢,有个空.
呵呵
#9
CString m_str;
显然m_str是一个对象了
用m_str 和 NULL 进行比较,虽然语法上是可以,但是肯定不对
运行会出错误的
CString重载了 == 符号
if ("" == m_str ) 这个比较是对的
显然m_str是一个对象了
用m_str 和 NULL 进行比较,虽然语法上是可以,但是肯定不对
运行会出错误的
CString重载了 == 符号
if ("" == m_str ) 这个比较是对的
#10
NULL是指针的无效值,""是一个有效的字符串
char *p = NULL; //p指针是NULL,无效,没有分配内存,p的值就是0,*p错误
char *c = ""; //c指针指向一块内存,c指针是有效的,内存里面就放了一个'\0',或者说就是0,c的值是一个地址,*c == ""
p = ""; //由于p没有分配内存,这是错误的
c = NULL; //现在c指针也无效了。内存中本来c地址的那块就成了内存漏洞
char *p = NULL; //p指针是NULL,无效,没有分配内存,p的值就是0,*p错误
char *c = ""; //c指针指向一块内存,c指针是有效的,内存里面就放了一个'\0',或者说就是0,c的值是一个地址,*c == ""
p = ""; //由于p没有分配内存,这是错误的
c = NULL; //现在c指针也无效了。内存中本来c地址的那块就成了内存漏洞
#11
这样吧
char * p1 = "";
char * p2 = NULL;
这两个函数运行完了,你看他们的变量有何区别
两者显然是不同的,前者还是有空间的,而后者则是0
"" 它是一个长度为0的字符串
NULL是一个空指针
他们不同
char * p1 = "";
char * p2 = NULL;
这两个函数运行完了,你看他们的变量有何区别
两者显然是不同的,前者还是有空间的,而后者则是0
"" 它是一个长度为0的字符串
NULL是一个空指针
他们不同
#12
NULL 主要用于指针,表示空的
"" 主要用于字符串
---------------------------
没错。
null 主要用于指针,表示空的,但是什么是空的呢,在面向对象的程序设计里,如果把null衍生到现实问题中,个人理解它表示还没有确定的值。例如:如果你用一个量来表示某种物品的价格,如果这个量是null的话,表示价格还没有确定。并不代表什么都没有。
"" 这个就是一个空串。
"" 主要用于字符串
---------------------------
没错。
null 主要用于指针,表示空的,但是什么是空的呢,在面向对象的程序设计里,如果把null衍生到现实问题中,个人理解它表示还没有确定的值。例如:如果你用一个量来表示某种物品的价格,如果这个量是null的话,表示价格还没有确定。并不代表什么都没有。
"" 这个就是一个空串。
#13
当我们用正面的语句声明CString对象的时候:
CString str1,str2;
系统在内存中为我们分配的两个CString对象(每个占4个字节),你用下面语句一看便知:
cout<<&str1<<endl;
cout<<&str2<<endl;
这里可近似理解成一个指向char*字符数组首地址的指针。
现在回到你的问题中来,m_str==NULL相当把这个指针清零,不指向任何地址;而m_str==""表示指向一个空字符串数组的首地址,虽然为空串,但这时的m_str指向的地方是一个实实在在的字符串的首地址。
CString str1,str2;
系统在内存中为我们分配的两个CString对象(每个占4个字节),你用下面语句一看便知:
cout<<&str1<<endl;
cout<<&str2<<endl;
这里可近似理解成一个指向char*字符数组首地址的指针。
现在回到你的问题中来,m_str==NULL相当把这个指针清零,不指向任何地址;而m_str==""表示指向一个空字符串数组的首地址,虽然为空串,但这时的m_str指向的地方是一个实实在在的字符串的首地址。
#14
要停电了,明天再说。这时0:00停电-_-
#15
为避免楼主受其它回答干扰,引用下面回答,我觉得这个回答最清晰好理解
happy__888([顾问团]寻开心)
这样吧
char * p1 = "";
char * p2 = NULL;
这两个函数运行完了,你看他们的变量有何区别
两者显然是不同的,前者还是有空间的,而后者则是0
"" 它是一个长度为0的字符串
NULL是一个空指针
他们不同
happy__888([顾问团]寻开心)
这样吧
char * p1 = "";
char * p2 = NULL;
这两个函数运行完了,你看他们的变量有何区别
两者显然是不同的,前者还是有空间的,而后者则是0
"" 它是一个长度为0的字符串
NULL是一个空指针
他们不同
#16
NULL指地址0x00000000,而 "" 指字符串 "\0" .
#17
用isEmpty()判断
#18
问个有趣的问题:"",空字串占多少字节呢.
如果是0字节,就是说没有分配空间,那么CString *P="";时, 虽然这完全合法,但指针这时指到什么地方去了.
如果是0字节,就是说没有分配空间,那么CString *P="";时, 虽然这完全合法,但指针这时指到什么地方去了.
#19
int main(int argc, char* argv[])
{
char *str;
char *str2;//str=str2=0xcccccccc(刚申请的指针,只要没初始化都指向0xcccccccc)
str=new char(5); //str=0x00341000,*str=随机数(乱码)
str="name"; //str=0x00422fb4, str+1=0x00422fb5, *(str+1)="ame",
//(原开辟的内存没有用到,又开辟了一段)
//若用原来开辟的内存则用strcpy(str,"name");
//*str='n'('n'的ASCII码值为110)
//*(str+1)='a' *(str+2)='m' *(str+3)='e' *(str+4)=''(''的ASCII码值为0)
//*(str+5)='' *(str+6)=''(没有开辟的都为'',即'\0') str+4=0x00422fb8
str2="zhang"; //str2=0x422fac *str2='z' *(str2+4)='g' *str(str2+5)='' *(str+8)='n' "name"中的n
//可见分配内存时先分配的变量在内存的高地址,但字符串的首在低字节,尾在高字节,
//"name"长4 从0x00422fb4到0x00422fb8
//"zhang"长5 从0x00422fac到0x00422fb3(共8位后3位都为'\0')
str=NULL; //str=0x00000000,NULL是指向0x00000000的指针,任何类型的指针都可赋值为NULL
printf("Hello World!\n");
return 0;
}
{
char *str;
char *str2;//str=str2=0xcccccccc(刚申请的指针,只要没初始化都指向0xcccccccc)
str=new char(5); //str=0x00341000,*str=随机数(乱码)
str="name"; //str=0x00422fb4, str+1=0x00422fb5, *(str+1)="ame",
//(原开辟的内存没有用到,又开辟了一段)
//若用原来开辟的内存则用strcpy(str,"name");
//*str='n'('n'的ASCII码值为110)
//*(str+1)='a' *(str+2)='m' *(str+3)='e' *(str+4)=''(''的ASCII码值为0)
//*(str+5)='' *(str+6)=''(没有开辟的都为'',即'\0') str+4=0x00422fb8
str2="zhang"; //str2=0x422fac *str2='z' *(str2+4)='g' *str(str2+5)='' *(str+8)='n' "name"中的n
//可见分配内存时先分配的变量在内存的高地址,但字符串的首在低字节,尾在高字节,
//"name"长4 从0x00422fb4到0x00422fb8
//"zhang"长5 从0x00422fac到0x00422fb3(共8位后3位都为'\0')
str=NULL; //str=0x00000000,NULL是指向0x00000000的指针,任何类型的指针都可赋值为NULL
printf("Hello World!\n");
return 0;
}
#20
我来回答这个问题:
问个有趣的问题:"",空字串占多少字节呢.
如果是0字节,就是说没有分配空间,那么CString *P="";时, 虽然这完全合法,但指针这时指到什么地方去了.
空串占一个字节,这个字节的内容是0x00
问个有趣的问题:"",空字串占多少字节呢.
如果是0字节,就是说没有分配空间,那么CString *P="";时, 虽然这完全合法,但指针这时指到什么地方去了.
空串占一个字节,这个字节的内容是0x00
#21
可以通过这种方式测试一下:
int main()
{
char str1=""; //设置断点看str1的值
char str2=""; //设置断点看str2的值
char str3=""; //设置断点看str3的值
char str4=""; //设置断点看str4的值
printf("hello world!");
return 0;
}
int main()
{
char str1=""; //设置断点看str1的值
char str2=""; //设置断点看str2的值
char str3=""; //设置断点看str3的值
char str4=""; //设置断点看str4的值
printf("hello world!");
return 0;
}