是否可以在 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 未初始化或指向字符串文字,如@9​​87654364@,那么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 = &amp;c[0] 并通过*(d+1)等访问元素c[1]。

【讨论】:

或者你也可以char *d = c;

以上是关于是否可以在 C 中将 char[] 转换为 char*?的主要内容,如果未能解决你的问题,请参考以下文章

如何在C中将char转换为整数? [复制]

在 C 中将 char* 转换为 wchar*

在C中将char从大端转换为小端

在 C 中将 ascii char[] 转换为十六进制 char[]

c_cpp 如何在C中将const char *转换为char *?

如何在 C 中将 void 指针转换为 char 指针