是否可以将 char[] 转换为 char*?

问题描述 投票:0回答:5

我正在做一个作业,我们必须将一系列字符串从文件读取到数组中。我必须在数组上调用密码算法(密码转置二维数组)。因此,一开始我将文件中的所有信息放入一个 2D 数组中,但我在其余代码中遇到了很多类型冲突的问题(特别是尝试将

char[]
设置为
char*
)。因此,我决定切换到指针数组,这使得我的大部分代码中的一切都变得更加容易。

但现在我需要将

char*
转换为
char[]
然后再转换回来,但我不明白。我在谷歌上找不到任何东西。我开始怀疑这是否可能。

c char
5个回答
131
投票

听起来您对指针和数组感到困惑。指针和数组(在本例中为

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
的地址”。


22
投票

如果你有

char[] c
那么你可以做
char* d = &c[0]
并通过执行
*(d+1)
等访问元素 c[1]


3
投票

如果您想将它们用作指针,则无需将它们声明为数组。您可以简单地引用指针,就好像它们是多维数组一样。只需将其创建为指向指针的指针并使用

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]
或其他。


1
投票

除了 strtok 之外,以上都不对我有用

#include <string.h>

然后使用

strtok

char some[] = "some string";
char *p = strtok(some, "");

strtok
用于分割字符串。但你可以看到我没有把它分开
""

现在你有了一个指针。


0
投票

我发现从 char [] 转换为 char* 的一种方法是使用 strdup() 函数。使用方法如下:

Char word[] = “Hello”;
Char *p = strdup(word);

注:

您需要#include 。另外,在使用完指针后,您将需要使用 free(p) 方法。我相信 strdup() 函数在堆上分配一块内存。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.