可以在C中将char []转换为char*吗?

tpa*_*arf 51 c char

我正在进行一项任务,我们必须从文件中读取一系列字符串到数组中.我必须在数组上调用密码算法(密码转换2D数组).所以,首先我把文件中的所有信息都放到了一个2D数组中,但是我在其余的代码中遇到了冲突类型的问题(特别是尝试将char []设置为char*).所以,我决定切换到一个指针数组,这使我的大部分代码都变得更容易.

但现在我需要将char*转换为char []并再次返回,但我无法弄明白.我一直无法在谷歌上找到任何东西.我开始怀疑它是否可能.

Tim*_*nes 102

听起来你在指针和数组之间感到困惑.指针和数组(在这种情况下char *和char [])不是一回事.

  • 数组char a[SIZE]表示该位置的值a是一个长度数组SIZE
  • 指针char *a;表示位置的值a是指向a的指针char.这可以与指针算法结合使用,就像一个数组(例如,a[10]在任何地方都是10个条目a)

在内存中,它看起来像这样(例子来自FAQ):

 char a[] = "hello";  // array

   +---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
   +---+---+---+---+---+---+

 char *p = "world"; // pointer

   +-----+     +---+---+---+---+---+---+
p: |  *======> | w | o | r | l | d |\0 |
   +-----+     +---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

很容易混淆指针和数组之间的区别,因为在很多情况下,数组引用"衰减"到指向它的第一个元素的指针.这意味着在许多情况下(例如传递给函数调用时)数组成为指针.如果您想了解更多信息,C FAQ的这一部分将详细介绍差异.

一个主要的实际区别是编译器知道数组有多长.使用上面的例子:

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)
Run Code Online (Sandbox Code Playgroud)

在没有看到你的代码的情况下,很难推荐最好的行动方案,但我怀疑改变使用指针到处可以解决你目前遇到的问题.请注意,现在:

  • 您将需要在数组曾经存在的任何地方初始化内存.例如,char a[10];将成为char *a = malloc(10 * sizeof(char));,然后检查a != NULL.请注意,sizeof(char)在这种情况下,您实际上并不需要说,因为它sizeof(char)被定义为1.我将其保留为完整性.

  • 您以前sizeof(a)用于数组长度的任何地方都需要替换为您分配的内存长度(如果您使用的是字符串,则可以使用strlen(),最多可以使用'\0').

  • 您需要free()为每次通话拨打相应的电话malloc().这告诉计算机您使用了所要求的内存malloc().如果您的指针是a,只需free(a);在代码中的某个位置写入,您知道不再需要任何a指向.

正如另一个答案所指出的,如果你想得到一个数组开头的地址,你可以使用:

char* p = &a[0] 
Run Code Online (Sandbox Code Playgroud)

你可以看这是"字符指针p变成一个元素的地址[0]的a".


dav*_*ave 14

如果你有, char[] c 你可以做, char* d = &c[0] 并通过做*(d+1),等等访问元素c [1] .

  • 或者你也可以`char * d = c;`。 (2认同)