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