c 函数定义调用指针,但示例不使用指针

问题描述

我对 C 等低级编程比较陌生。我正在查看 strstr() 函数 here。在查看函数定义 char *strstr(const char *str1,const char *str2); 时,我知道该函数将返回一个指针或一个 NULL,具体取决于是否在 str1 中找到了 str2。

但我不明白的是,如果函数要求两个输入为指针,那么示例何时不使用指针?

#include <string.h>
int main ()
{
  char string[55] ="This is a test string for testing";
  char *p;
  p = strstr (string,"test");
  if(p)
  {
    printf("string found\n" );
    printf ("First occurrence of string \"test\" in \"%s\" is"\
           " \"%s\"",string,p);
  }
  else printf("string not found\n" );
   return 0;
}

解决方法

strstr(string,"test"); 中,string 是一个包含 55 个 char 的数组。 strstr 这里需要的是一个指向 string 的第一个元素的指针,我们可以写成 &string[0]。但是,为方便起见,C 会自动将 string 转换为指向其第一个元素的指针。所以想要的值传递给strstr,它是一个指针。

只要在表达式中使用数组并且不是 sizeof 的操作数、不是一元 & 的操作数、也不是用于初始化数组的字符串文字,就会发生这种自动转换.

"test" 是一个字符串文字。它导致创建一个 char 数组,用字符串中的字符初始化,后跟一个终止空字符。源代码中的字符串文字表示该数组。由于它是表达式中使用的数组,因此它也被转换为指向其第一个元素的指针。因此,再次将所需的指针传递给 strstr

您可以改为写 &"test"[0],但这会使不习惯的人感到困惑。