我一直搞不清楚NULL与""的区别,那位高手能帮忙解释下

时间:2021-12-15 16:25:00
如判断一个CString类m_str是不时空
if(m_str=="") 能不能用m_str==NULL代替,真的很模糊。
另外MFC函数中没有用的可以用NULL代替,可这些MSDN有时又没直接说明,真的不知道这参数该怎么写上去。
一般你们碰见问题怎么解决

21 个解决方案

#1


"" 一般是指字符串
NULL 一般用于地址

#2


NULL就是个字节值,里面放着0X00,如果你把他看做字符的话,就是字符的结束符.

#3


CString 有 IsEmpty判断为空。

#4


如果从机器角度来看都是绝对 0 ,
NULL 一般是 头文件中#define  NULL 0;(你看不到的)

#5


NULL一般用于给指针赋值为空,""指空字符串

#6


NULL  主要用于指针,表示空的
""    主要用于字符串

#7


NULL  主要用于指针,表示空的
""    主要用于字符串

没错

#8


NULL  主要用于指针,表示空的
""    主要用于字符串
=========
这种不够说服力.那指针还可以用0呢.
好像这个东西也比较难说清楚,
以前老师说是:NULL就是什么也没有,""呢,有个空.
呵呵

#9


CString 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地址的那块就成了内存漏洞

#11


这样吧

   char * p1 = "";
   char * p2 = NULL;

这两个函数运行完了,你看他们的变量有何区别
两者显然是不同的,前者还是有空间的,而后者则是0

"" 它是一个长度为0的字符串
NULL是一个空指针
他们不同

#12


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指向的地方是一个实实在在的字符串的首地址。

#14


要停电了,明天再说。这时0:00停电-_-

#15


为避免楼主受其它回答干扰,引用下面回答,我觉得这个回答最清晰好理解

happy__888([顾问团]寻开心) 

这样吧

   char * p1 = "";
   char * p2 = NULL;

这两个函数运行完了,你看他们的变量有何区别
两者显然是不同的,前者还是有空间的,而后者则是0

"" 它是一个长度为0的字符串
NULL是一个空指针
他们不同

#16


NULL指地址0x00000000,而 "" 指字符串 "\0" .

#17


用isEmpty()判断

#18


问个有趣的问题:"",空字串占多少字节呢.
如果是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;
}

#20


我来回答这个问题:

问个有趣的问题:"",空字串占多少字节呢.
如果是0字节,就是说没有分配空间,那么CString *P="";时, 虽然这完全合法,但指针这时指到什么地方去了.


空串占一个字节,这个字节的内容是0x00

#21


可以通过这种方式测试一下:
int main()
{
    char str1="";          //设置断点看str1的值
    char str2="";          //设置断点看str2的值
    char str3="";          //设置断点看str3的值
    char str4="";          //设置断点看str4的值
    printf("hello world!");

    return 0;
}

#1


"" 一般是指字符串
NULL 一般用于地址

#2


NULL就是个字节值,里面放着0X00,如果你把他看做字符的话,就是字符的结束符.

#3


CString 有 IsEmpty判断为空。

#4


如果从机器角度来看都是绝对 0 ,
NULL 一般是 头文件中#define  NULL 0;(你看不到的)

#5


NULL一般用于给指针赋值为空,""指空字符串

#6


NULL  主要用于指针,表示空的
""    主要用于字符串

#7


NULL  主要用于指针,表示空的
""    主要用于字符串

没错

#8


NULL  主要用于指针,表示空的
""    主要用于字符串
=========
这种不够说服力.那指针还可以用0呢.
好像这个东西也比较难说清楚,
以前老师说是:NULL就是什么也没有,""呢,有个空.
呵呵

#9


CString 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地址的那块就成了内存漏洞

#11


这样吧

   char * p1 = "";
   char * p2 = NULL;

这两个函数运行完了,你看他们的变量有何区别
两者显然是不同的,前者还是有空间的,而后者则是0

"" 它是一个长度为0的字符串
NULL是一个空指针
他们不同

#12


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指向的地方是一个实实在在的字符串的首地址。

#14


要停电了,明天再说。这时0:00停电-_-

#15


为避免楼主受其它回答干扰,引用下面回答,我觉得这个回答最清晰好理解

happy__888([顾问团]寻开心) 

这样吧

   char * p1 = "";
   char * p2 = NULL;

这两个函数运行完了,你看他们的变量有何区别
两者显然是不同的,前者还是有空间的,而后者则是0

"" 它是一个长度为0的字符串
NULL是一个空指针
他们不同

#16


NULL指地址0x00000000,而 "" 指字符串 "\0" .

#17


用isEmpty()判断

#18


问个有趣的问题:"",空字串占多少字节呢.
如果是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;
}

#20


我来回答这个问题:

问个有趣的问题:"",空字串占多少字节呢.
如果是0字节,就是说没有分配空间,那么CString *P="";时, 虽然这完全合法,但指针这时指到什么地方去了.


空串占一个字节,这个字节的内容是0x00

#21


可以通过这种方式测试一下:
int main()
{
    char str1="";          //设置断点看str1的值
    char str2="";          //设置断点看str2的值
    char str3="";          //设置断点看str3的值
    char str4="";          //设置断点看str4的值
    printf("hello world!");

    return 0;
}