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

时间:2012-03-09 02:01:54

标签: c char

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

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

4 个答案:

答案 0 :(得分:99)

听起来你在指针和数组之间感到困惑。指针和数组(在本例中为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()最多'\0')。

  • 每次拨打malloc()时,您都需要拨打相应的free()电话。这告诉计算机您使用malloc()所要求的内存完成了。如果您的指针为a,只需在代码中的某个位置写下free(a);,您知道不再需要a点。

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

char* p = &a[0] 

您可以将此读作“char指针p成为[0]”的元素a的地址。

答案 1 :(得分:13)

如果你有 char[] c 那么你可以做到 char* d = &c[0] 通过*(d+1)等来访问元素c [1]

答案 2 :(得分: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]或其他任何内容。

答案 3 :(得分:-5)

嗯,我不确定你理解你的问题......

在C中,Char []和Char *是相同的。

编辑:感谢这个有趣的链接。