是否有可能将char 转换为C中的char *?

我正在做一个任务,我们必须从文件读取一系列string到数组中。 我必须调用数组上的密码algorithm(密码转置2D数组)。 所以,起初我把文件中的所有信息放到一个二维数组中,但是在我的其他代码中(特别是试图将char []设置为char *),我遇到了很多麻烦。 所以,我决定切换到一个指针数组,这使得我的大部分代码都变得更加简单。

但现在我需要将char *转换为char [],然后再回来,但我无法弄清楚。 我一直无法find谷歌上的任何东西。 我开始怀疑这是否可能。

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

  • 数组char a[SIZE]表示a位置的值是一个长度为SIZE的数组
  • 指针char *a;a位置的值是一个指向char的指针。 这可以与指针算术结合起来,就像一个数组一样(例如, a[10]在任何点上都是10个入口)

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

  char a[] = "hello"; // array +---+---+---+---+---+---+ a: | h | e | l | l | o |\0 | +---+---+---+---+---+---+ char *p = "world"; // pointer +-----+ +---+---+---+---+---+---+ p: | *======> | w | o | r | l | d |\0 | +-----+ +---+---+---+---+---+---+ 

对指针和数组之间的区别很容易混淆,因为在许多情况下,数组引用会“衰减”到指向它的第一个元素的指针。 这意味着在很多情况下(比如当传递给函数调用时)数组变成指针。 如果您想了解更多, 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) 

没有看到你的代码,很难推荐最好的行动scheme,但我怀疑改变在任何地方使用指针将解决你目前遇到的问题。 请注意,现在:

  • 无论arrays在哪里,您都需要初始化内存。 例如, char a[10]; 将变成char *a = malloc(10 * sizeof(char)); ,然后检查a != NULL 。 请注意,在这种情况下,您实际上并不需要说sizeof(char) ,因为sizeof(char)被定义为1.为了完整性,我将它留下。

  • 你以前的sizeof(a)在数组长度上的任何位置都需要被你分配的内存长度所替代(如果你使用的是string,你可以使用strlen() ,这个值可以计算到'\0' )。

  • 您将需要对每个对malloc()调用进行相应的调用free() malloc() 。 这告诉您使用malloc()要求的内存完成计算机。 如果你的指针是a ,只需要写free(a); 在代码中的一个点,你知道你不再需要任何指向。

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

 char* p = &a[0] 

你可以把它看作“char指针p成为一个元素[0]的地址”。

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

如果你想使用它们作为指针,你不需要将它们声明为数组。 您可以简单地引用指针,就好像它们是multidimensional array一样。 只要创build它作为指针的指针,并使用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]或者其他什么。

那么,我不知道你的问题。

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

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