是否有可能将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 *是相同的东西。
编辑:感谢这个有趣的链接。