是否可以在 C 中将 char[] 转换为 char*?
Posted
技术标签:
【中文标题】是否可以在 C 中将 char[] 转换为 char*?【英文标题】:Is it possible to convert char[] to char* in C? 【发布时间】:2012-03-26 13:03:34 【问题描述】:我正在执行一项任务,我们必须将文件中的一系列字符串读取到数组中。我必须在数组上调用密码算法(密码转置二维数组)。因此,起初我将文件中的所有信息放入一个二维数组中,但我在其余代码中遇到了很多冲突类型的问题(特别是尝试将 char[] 设置为 char*)。所以,我决定切换到一个指针数组,这让我的大部分代码中的一切都变得更加容易。
但现在我需要将 char* 转换为 char[] 并再次转换回来,但我无法弄清楚。我一直无法在谷歌上找到任何东西。我开始怀疑这是否可能。
【问题讨论】:
阅读comp.lang.c FAQ的第6部分。 【参考方案1】:听起来您对指针和数组感到困惑。指针和数组(在本例中为 char *
和 char []
)为 not the same thing.
char a[SIZE]
表示a
位置的值是一个长度为SIZE
的数组
指针char *a;
表示a
位置的值是指向char
的指针。这可以与指针算法相结合,使其表现得像一个数组(例如,a[10]
是超过 a
点的 10 个条目)
在内存中,它看起来像这样(示例取自the FAQ):
char a[] = "hello"; // array
+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+
char *p = "world"; // pointer
+-----+ +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d |\0 |
+-----+ +---+---+---+---+---+---+
指针和数组之间的区别很容易混淆,因为在许多情况下,数组引用“衰减”到指向它的第一个元素的指针。这意味着在许多情况下(例如传递给函数调用时)数组成为指针。如果您想了解更多信息,请this section of the C FAQ describes the differences in detail。
一个主要的实际区别是编译器知道数组的长度。使用上面的例子:
char a[] = "hello";
char *p = "world";
sizeof(a); // 6 - one byte for each character in the string,
// one for the '\0' terminator
sizeof(p); // whatever the size of the pointer is
// probably 4 or 8 on most machines (depending on whether it's a
// 32 or 64 bit machine)
如果没有看到您的代码,很难推荐最佳行动方案,但我怀疑更改为在任何地方使用指针将解决您当前遇到的问题。请注意:
您将需要在数组曾经所在的任何位置初始化内存。例如,char a[10];
将变为char *a = malloc(10 * sizeof(char));
,然后检查a != NULL
。请注意,在这种情况下,您实际上不需要说 sizeof(char)
,因为 sizeof(char)
被定义为 1。为了完整起见,我将其保留。
您以前使用sizeof(a)
表示数组长度的任何位置都需要替换为您分配的内存长度(如果您使用的是字符串,则可以使用strlen()
,它最多可计算为@ 987654345@)。
每次拨打malloc()
时,您都需要拨打相应的电话至free()
。这告诉计算机您已完成使用malloc()
请求的内存。如果您的指针是a
,只需在代码中您知道不再需要任何a
指向的位置处写入free(a);
。
正如另一个答案所指出的,如果你想获取一个数组的起始地址,你可以使用:
char* p = &a[0]
您可以将其理解为“字符指针p
成为a
的元素[0]
的地址”。
【讨论】:
在最后一个例子中,char *p = &a[0]
不能简化为char *p = &a
吗?
@thom_nic:不,因为&a
的类型为char (*)[6]
,即指向六个字符数组的指针。这与char *
不同,因此您会收到警告。但是,您可以说char *p = a;
,因为数组引用可以decay into a pointer to its first element。我在这里使用了较长的形式,因为它更好地说明了正在发生的事情。
啊,我看到我在倒数第二行使用的词可能令人困惑。我已经编辑了答案。
我还要补充一点,在char *a
的情况下,如果a
未初始化或指向字符串文字,如@987654364@,那么a[0]
或a[1]
将是有效的读取,但任何尝试写入 a
指向的内容都将无效,从而导致分段错误。【参考方案2】:
如果您想将它们用作指针,则无需将它们声明为数组。您可以像引用多维数组一样简单地引用指针。只需将其创建为指向指针的指针并使用malloc
:
int i;
int M=30, N=25;
int ** buf;
buf = (int**) malloc(M * sizeof(int*));
for(i=0;i<M;i++)
buf[i] = (int*) malloc(N * sizeof(int));
然后您可以引用buf[3][5]
或其他任何内容。
【讨论】:
不要转换malloc()
的结果。
这是必要的,因为malloc()
返回一个void *
,需要将其转换为int *
才能存储在buf
中。
不,不需要演员表。在 C 中,void*
类型的表达式可以隐式转换为任何指向对象(或指向不完整的指针)的类型。请参阅comp.lang.c FAQ 的问题 7.7b 和C standard 的第 6.5.16.1 节。 (C++ 有不同的规则,如果我们讨论 C++,这将是相关的。)【参考方案3】:
好吧,我不确定你的问题……
在 C 中,Char[] 和 Char* 是一回事。
编辑:感谢这个有趣的链接。
【讨论】:
恐怕这不是真的 - pointers and arrays are not the same thing in C @TimothyJones:FAQ 的更好链接是c-faq.com。当然,你是 100% 正确的:数组和指针不是一回事。 (它的拼写是char
,而不是Char
;这很重要。)
说“在大多数情况下表现相似”可能更合适。
@HotLicks:不,这也不对。指针包含某个对象的地址。数组包含一系列对象。它们不仅不相同,甚至不相似。数组通常通过指向其成员的指针访问。
@KeithThompson:糟糕,我没有注意到 URL。我不能再编辑我的评论了:(这里是更好的直接链接:c-faq.com/aryptr/aryptr2.html【参考方案4】:
如果你有
char[] c
那么你可以做
char* d = &c[0]
并通过*(d+1)
等访问元素c[1]。
【讨论】:
或者你也可以char *d = c;
。以上是关于是否可以在 C 中将 char[] 转换为 char*?的主要内容,如果未能解决你的问题,请参考以下文章
在 C 中将 ascii char[] 转换为十六进制 char[]