Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中是否可以将char[]转换为char*?_C_Char - Fatal编程技术网

在C语言中是否可以将char[]转换为char*?

在C语言中是否可以将char[]转换为char*?,c,char,C,Char,我在做一个任务,我们必须从一个文件中读取一系列字符串到一个数组中。我必须调用数组上的密码算法(密码转置2D数组)。因此,起初我将文件中的所有信息放入一个2D数组中,但我在代码的其余部分遇到了很多冲突类型的问题(特别是试图将char[]设置为char*)。因此,我决定切换到一个指针数组,这使得我的大部分代码中的所有内容都变得更加简单 但现在我需要将char*转换为char[],然后再转换回来,但我想不出来。我在谷歌上找不到任何东西。我开始怀疑这是否可能。如果你有 char[]c 那你就可以了 ch

我在做一个任务,我们必须从一个文件中读取一系列字符串到一个数组中。我必须调用数组上的密码算法(密码转置2D数组)。因此,起初我将文件中的所有信息放入一个2D数组中,但我在代码的其余部分遇到了很多冲突类型的问题(特别是试图将char[]设置为char*)。因此,我决定切换到一个指针数组,这使得我的大部分代码中的所有内容都变得更加简单

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

如果你有
char[]c
那你就可以了
char*d=&c[0]

并通过执行
*(d+1)
等操作访问元素c[1]。

好吧,我不确定是否理解您的问题

在C语言中,Char[]和Char*是同一事物


编辑:感谢这个有趣的链接。

如果要将它们用作指针,则无需将它们声明为数组。您可以简单地引用指针,就像它们是多维数组一样。只需将其创建为指向指针的指针,然后使用
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));
inti;
int M=30,N=25;
国际单位**buf;
buf=(int**)malloc(M*sizeof(int*);

对于(i=0;i这听起来像是指针和数组之间的混淆。指针和数组(在本例中为
char*
char[]
)是

  • 数组
    chara[SIZE]
    表示
    a
    位置的值是长度
    SIZE
  • 指针
    char*A;
    表示
    A
    位置处的值是指向
    char
    的指针。这可以与指针算法相结合,表现得像一个数组(例如,
    A[10]
    A
    点过去的10个条目)
在内存中,它看起来像这样(示例取自):

指针和数组之间的区别很容易被混淆,因为在许多情况下,数组引用“衰减”到指向其第一个元素的指针。这意味着在许多情况下(例如,当传递到函数调用时),数组成为指针。如果您想了解更多

一个主要的实际区别是编译器知道数组的长度。使用上面的示例:

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()在代码中的某一点上,你知道你不再需要
    a
    指向的任何东西

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

char* p = &a[0] 

你可以这样理解:“char pointer
p
成为
a
元素
[0]
的地址。”

恐怕这不是真的-@TimothyJones:FAQ的一个更好的链接是。当然,你是100%正确的:数组和指针不是一回事。(它的拼写是
char
,而不是
char
;它很重要。)说“在大多数情况下行为相似”可能更合适.@HotLicks:不,那也不对。指针包含某个对象的地址。数组包含一系列对象。它们不仅不相同,甚至不相似。数组通常通过指向其成员的指针进行访问。@KeithThompson:噢,我没有注意到URL。不过我无法再编辑我的注释了:(这里是更好的直接链接:或者您可以直接使用
char*d=c;
。不要强制转换
malloc()的结果。
。这是必要的,因为
malloc()
返回一个
void*
,需要将其强制转换为
int*
以存储在
buf
中。不需要强制转换。在C中,类型为
void*
的表达式可以隐式转换为指向对象(或指向不完整对象的指针)的任何指针类型。请参阅的问题7.7b和第6.5.16.1节。(C++中有不同的规则,如果我们讨论C++,则它是相关的)。在最后一个例子中,不能将代码> char *p=和a(0)< /C>简化为“代码> char *p=和a < /c> >代码:不,因为<代码>和A <代码>类型为<代码> char(*)(6)。
,即指向一个由六个字符组成的数组的指针。这与
char*
不同,因此你会得到一个警告。但是,你可以说
char*p=a;
,因为数组引用可以。我在这里使用了较长的形式,因为它更好地说明发生了什么。啊,我看到我在最后一行中使用的单词可能是en混淆。我编辑了答案。我还想在
char*a
的情况下添加,如果
a
未初始化或指向字符串文字,如
char*a=“hello”
,则
a[0]
a[1]
将是有效的读取,但任何尝试写入
a
指向的内容都将无效,从而导致分段错误。
char* p = &a[0]