【问题标题】:c function definition calls for pointer but example does not use pointersc函数定义调用指针,但示例不使用指针
【发布时间】:2021-02-04 14:55:40
【问题描述】:

我对 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;
}

【问题讨论】:

  • 字符串是数组。当传递给函数时,数组会变成(衰减到)指针。
  • 为什么你认为这个例子没有使用指针? stringchar *"test" 也是。 (而string是一个char数组,衰减为char *

标签: c pointers strstr


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多