我正在做一个作业,我们必须将一系列字符串从文件读取到数组中。我必须在数组上调用密码算法(密码转置二维数组)。因此,一开始我将文件中的所有信息放入一个 2D 数组中,但我在其余代码中遇到了很多类型冲突的问题(特别是尝试将
char[]
设置为 char*
)。因此,我决定切换到指针数组,这使得我的大部分代码中的一切都变得更加容易。
但现在我需要将
char*
转换为 char[]
然后再转换回来,但我不明白。我在谷歌上找不到任何东西。我开始怀疑这是否可能。
听起来您对指针和数组感到困惑。指针和数组(在本例中为
char *
和 char []
)不是一回事。
char a[SIZE]
表示a
位置的值是一个长度为SIZE
char *a;
表示a
位置处的值是指向char
的指针。这可以与指针算术结合起来,表现得像一个数组(例如,a[10]
是过去a
点的10个条目)在记忆中,它看起来像这样(示例取自常见问题解答):
char a[] = "hello"; // array
+---+---+---+---+---+---+
a: | h | e | l | l | o |\0 |
+---+---+---+---+---+---+
char *p = "world"; // pointer
+-----+ +---+---+---+---+---+---+
p: | *======> | w | o | r | l | d |\0 |
+-----+ +---+---+---+---+---+---+
很容易对指针和数组之间的区别感到困惑,因为在许多情况下,数组引用“衰减”到指向其第一个元素的指针。这意味着在许多情况下(例如当传递给函数调用时)数组变成指针。如果您想了解更多信息,C 常见问题解答的这一部分详细描述了这些差异。
一个主要的实际区别是编译器知道数组有多长。使用上面的例子:
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'
)。 每次拨打 free()
时,您都需要拨打相应的电话
malloc()
。这会通过 malloc()
告诉计算机您已使用完所需的内存。如果您的指针是 a
,只需在代码中您知道不再需要 free(a);
指向的任何位置写入 a
即可。正如另一个答案指出的,如果你想获取数组的开头地址,可以使用:
char* p = &a[0]
您可以将其理解为“字符指针
p
成为[0]
的元素a
的地址”。
如果你有
char[] c
那么你可以做
char* d = &c[0]
并通过执行 *(d+1)
等访问元素 c[1]
如果您想将它们用作指针,则无需将它们声明为数组。您可以简单地引用指针,就好像它们是多维数组一样。只需将其创建为指向指针的指针并使用
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]
或其他。
除了 strtok 之外,以上都不对我有用
#include <string.h>
然后使用
strtok
char some[] = "some string";
char *p = strtok(some, "");
strtok
用于分割字符串。但你可以看到我没有把它分开""
现在你有了一个指针。
我发现从 char [] 转换为 char* 的一种方法是使用 strdup() 函数。使用方法如下:
Char word[] = “Hello”;
Char *p = strdup(word);
注:
您需要#include
希望这有帮助。