如何在 C 中创建指向整个字符串的指针?

Posted

技术标签:

【中文标题】如何在 C 中创建指向整个字符串的指针?【英文标题】:How do I make a pointer to an entire string in 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',您可能会发现此修改很有趣。 【参考方案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 循环并使用增量运算符增加指针

以上是关于如何在 C 中创建指向整个字符串的指针?的主要内容,如果未能解决你的问题,请参考以下文章

如何在codesys v3中创建指向函数的指针

如何根据字符串数量的输入在 C++ 中创建数组?

在属于不同类的函数中创建指向类的指针

我可以在所述对象的构造函数中创建指向对象的指针吗?

指向抽象类的指针

当我有指向它的指针时,如何在 C 中打印这个字符串?