【问题标题】:How do I make a pointer to an entire string in C?如何在 C 中创建指向整个字符串的指针?
【发布时间】:2022-01-19 14:14:59
【问题描述】:

我有以下代码,应该填写整个 main 函数只是为了演示指针是如何工作的。 e 是 4 的整数, f 是代码中的字符数组, g 是指向字符串“ABC”的指针。

我对@9​​87654324@ 和f 的工作原理有了很好的了解,但我对变量g 以及它是否实际上是指向字符串s 的指针感到好奇。

#include <stdio.h>

int foo(int a, char b[], char c, char *d)
{
}

int main(void)
{
  char s[] = {"ABC"};
  char *g = &s[2];
  int e = 4;
  char f[] = {'3', '7', '\0'};

 int y = foo(e, f, g[2], g);
}

【问题讨论】:

  • 你说g是一个指向字符串"ABC"的指针。不是char *g = &amp;s[2];,而是char *g = s;,其中数组s衰减指向一个指针。你所拥有的是一个指向字符串"C"的指针。
  • g 指向C,数组s 的第三个(记住数组是零索引的)元素。但绝不是指向整个字符串。由于字符串是空终止的,g 本身也可以被视为字符串。
  • 如果您将gputs(g) 一起打印,您会发现它指向的位置。或者,您也可以在您最喜欢的调试器中查看该指针。
  • char s[] = "ABCDEFGHI"; char *g = &amp;s[2]; ... foo(e, f, g[3], g); 可能会更有趣。由于您当前代码中的g[2]'\0',您可能会发现此修改很有趣。

标签: c string function pointers implicit-conversion


【解决方案1】:

这个函数声明

int foo(int a, char b[], char c, char *d);

等价于以下函数声明

int foo(int a, char *b, char c, char *d);

int foo(int a, char b[], char c, char d[]);

所有的函数声明都声明同一个函数。

具有数组类型的函数参数被编译器调整为指向数组元素类型的指针。

在这个函数的调用中

 int y = foo(e, f, g[2], g);

数组指示符 f 被转换为指向其第一个元素的指针。

你可以把这个调用想象成这样

You c int y = foo(e, &f[0], g[2], g);

变量g被数组s的第三个元素的地址初始化

char *g = &s[2];

这个指针作为第四个参数传递给函数。

你可以这样写

char s[] = {"ABC"};
char *g = s;

在这种情况下,数组指示符s 被隐式转换为指向其第一个元素的指针。那是声明

char *g = s;

等价于

char *g = &s[0];

由于您需要将指向整个数组的指针声明为对象,因此您需要编写

char ( *g )[4] = &s;

C 标准中的这句话很有用(6.3.2.1 左值、数组和函数指示符)

3 除非它是 sizeof 运算符的操作数或一元 & 运算符,或者是用于初始化数组的字符串文字, 具有“类型数组”类型的表达式被转换为 类型为“pointer to type”的表达式,指向初始 数组对象的元素并且不是左值。如果数组对象 有注册存储类,行为未定义。

【讨论】:

  • 所以默认情况下,如果我只是添加变量的名称,在这种情况下是'f',它会自动指向数组的第一个元素?
  • @Adele 是的,它将被隐式转换为指针,除了在运算符 sizeof 和运算符 & 的地址内。
【解决方案2】:

变量g指向字符串“abc”的第三个元素,即c。如果您希望 g 作为整个字符串的指针,则将其设置为,

char *g =s;

【讨论】:

  • 我通过一个 c 可视化器运行它,它表明如果我这样做,它指向字符串的第一个元素。这是正确的还是?
  • 是的,如果我们需要移动到其他字符,指针将指向第一个字符是正确的,我们必须使用 for 循环并使用增量运算符增加指针
猜你喜欢
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 2012-06-13
  • 2021-06-28
  • 1970-01-01
  • 2013-02-16
  • 2015-05-19
  • 1970-01-01
相关资源
最近更新 更多