strcmp如何在不使用*运算符的情况下比较地址的值?

时间:2017-02-11 16:48:59

标签: c pointers

即使没有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;
}

如果我使用*运算符比较地址值,则无法获得所需的输出。但是,如果我删除*运算符,它可以正常工作。

2 个答案:

答案 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)

完全有效 - 你传递指向函数的指针 - 而不是解引用的字符串。