关于C/C++中char*之间的比较和数组之间的比较的问题

char a[] = "abc";
char b[] = "abc";
char* c = "abc";
char* d = "abc";

if( a==b )
{
    cout<< "a[] and b[] are equal!" << endl;
}else if( a!=b )
{
      cout<< "a[] and b[] are not equal!" << endl;
}

if( c==d )
{
      cout<< "*c and *d are equal!" << endl;
}else if( c!=d )
{
      cout<< "*c and *d are not equal!" << endl;
}

请问输出结果是什么?为什么是这种结果?

a,b,c,d都是什么呀?把他们的声明写出来看看。

比较的是指针,也就是它们是不是同一个数组,而不是比较字符串是否一致。
要比较字符串用strcmp

![图片说明](https://img-ask.csdn.net/upload/201504/28/1430227969_765232.png)图片说明
其实只要你在if语句之前加上输出语句,就明白了,如图,数组a【】,b【】比较,你本意应该是比较数组相等,但是你如果if( a==b )这样比较就是将两个数组的首地址进行比较,而不是数组元素比较。指针*c,*d比较,if( c==d )这样比较的也是地址是指针指向字符的地址!

比较字符数组用strncmp等函数来比较内容。

不太明白你比较的意图。但要告诉你的是:指针的关系运算:< <= > >= (没见过 “==”的),前提是它们都指向同一个数组中的元素。根据你所使用的操作符,比较表达式将告诉你哪个指针指向数组中更前或更后的元素。标准并未定义如果两个任意的指针进行比较会产生什么结果。

这个问题很简单,首先a和b是数组变量会在栈区分配内存,其中a和b就是数组内存的起始地址。c和d是指针变量指向的是位于全局段的字符串字面值常量,其在内存中只存在一份,故而内存地址一样。

a,b不等,c,d相等
解释:a,b是数组变量,在编译的时候编译器把常量字符串"abc"(存放在程序的数据区域)复制给a和b,这样比较a和b就是比较a,b数组第一个元素的地址(a,b是两个不同的变量,内存中的位置也不同,只不过在两块不同的内存区域都存放了"abc"的副本)因为两个地址不同,所以结果就是不等。而c和d都是指向常量字符串"abc",它们指到了程序的数据区域了(数据区域的数据禁止修改,如果修改最好的结果是导致程序崩溃),指向的都是同一块内存,所以c等于d