如何在 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”的指针。
我对@987654324@ 和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 = &s[2];
,而是char *g = s;
,其中数组s
衰减指向一个指针。你所拥有的是一个指向字符串"C"
的指针。
g
指向C
,数组s
的第三个(记住数组是零索引的)元素。但绝不是指向整个字符串。由于字符串是空终止的,g
本身也可以被视为字符串。
如果您将g
与puts(g)
一起打印,您会发现它指向的位置。或者,您也可以在您最喜欢的调试器中查看该指针。
char s[] = "ABCDEFGHI"; char *g = &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 中创建指向整个字符串的指针?的主要内容,如果未能解决你的问题,请参考以下文章