即使没有strcmp
运算符,*
也会检查地址的值吗?如果是,我们如何使用strcmp
比较普通字符串?
#include <stdio.h>
#include <string.h>
int main()
{
char *name;
char *str;
char a[] = "Max", b[] = "Max";
name = a; str = b;
printf("Add 1: %p Add 2: %p\n", name, str);
if (!strcmp(*name, *str))
printf("Names Match\n");
return 0;
}
如果我使用*
运算符比较地址值,则无法获得所需的输出。但是,如果我删除*
运算符,它可以正常工作。
答案 0 :(得分:0)
为什么你认为strcmp()
不能取消引用指针?
它的方式是,你将一个指针传递给一个字符串,然后取消引用字符串逐字符比较,返回两个第一个diffrente字符之间的差异,或者至少原则上它是如何做的。< / p>
取消引用指针,不给出地址。我相信你对运营商的&
地址感到困惑。指针存储某些数据的虚拟内存地址,然后您可以使用*
解除引用运算符访问该内存。
相反,如果您有一个变量,并且您想要存储它的虚拟内存地址,那么您可以使用&
运算符。
由于您已经传递了一个指针,因此您需要strcmp()
所需的地址来开始重新匹配字符以进行比较。
另外,因为整数可以转换为指针而反之,你可以像这样在字符串的开头传递值
strcmp(*name, *str);
由于多种原因,此类操作的结果未定义,其中一个原因是*name
不是有效地址,因此取消引用它是未定义的行为。
虽然这会编译,但如果启用编译警告,您应该注意到编译器会抱怨它,因为这是一个非常未定义的事情。
关于字符串是什么以及它在内存中的表示方式,你只能将指向字符串的指针传递给任何函数,因为它是将数组传递给函数的唯一方法,甚至在传递它之前它可能是一个指针。实际上,像你一样传递值不允许strcmp()
知道字符串的位置,因此不可能比较单个字符。
答案 1 :(得分:0)
文档是你的朋友
http://www.cplusplus.com/reference/cstring/strcmp/
int strcmp ( const char * str1, const char * str2 );
str1 - C string to be compared.
str2 - C string to be compared.
你有
char *name;
char *str;
所以
strcmp(name, str)
完全有效 - 你传递指向函数的指针 - 而不是解引用的字符串。