我正在做一项任务,我们必须将文件中的一系列字符串读入array.我必须调用数组上的密码算法(密码转置2D数组).因此,一开始我将文件中的所有信息放入一个2D数组中,但是我在代码的睡觉中遇到了很多冲突类型的问题(特别是试图将char[]设置为char*).因此,我决定切换到指针数组,这使得我的大部分代码中的所有事情都变得容易得多.

但是现在我需要将char*转换为char[],然后再转换回来,但是我无法计算出来.我在谷歌上找不到任何东西.我开始怀疑这是否可能.

推荐答案

听起来你好像把指针和数组搞混了.指针和数组(在本例中是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,只需在代码中知道不再需要a所指向的位置处编写free(a);即可.

正如另一个答案所指出的,如果您想要获取数组开始的地址,您可以使用:

char* p = &a[0] 

您可以将其理解为"字符指针p成为a的元素[0]的地址".

C++相关问答推荐

如何将匿名VLA分配给指针?

为什么在传输 Big Data 时共享内存段的运行时间比管道更长?

你能用自己的地址声明一个C指针吗?

有效地计算由一组点构成的等边三角形和等腰三角形的数量

在C中使用JMP_buf数组进行线程化(在xv6中测试)

如何在ASM中访问C struct 成员

如何在C中打印包含扫描字符和整数的语句?

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

在Rust和C之间使用ffi时如何通过 struct 中的[U8;1]成员传递指针

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

RawMotion的XInput2错误(具有较高值的XISelectEvents上的BadValue)

ifdef __cplusplus中的整数文字单引号

cairo 剪辑区域是否存在多个矩形?

按长度对argv中的单词进行排序

从BIOS(8086)中读取刻度需要多少?

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

在C中使用无符号整数模拟有符号整数

C中的数组下标和指针算法给出了不同的结果

Tcl_GetDoubleFromObj在列表的迭代中是一个缺点

未使用sem_open正确初始化信号量