我正在进行一项任务,我们必须从文件中读取一系列字符串到数组中。我必须在数组上调用密码算法(密码转换2D数组)。所以,首先我把文件中的所有信息都放到了一个2D数组中,但是我在其余的代码中遇到了冲突类型的问题(特别是尝试将char []设置为char *)。所以,我决定切换到一个指针数组,这使我的大部分代码都变得更容易。
但是现在我需要将char *转换为char []并再次返回,但我无法弄明白。我一直无法在谷歌上找到任何东西。我开始怀疑它是否可能。
答案 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 *是相同的。
编辑:感谢这个有趣的链接。