这可能是一个非常简单的问题,但我似乎无法在网上找到明确的答案。假设a有一个指向数组的指针,声明为:
静态char newMessage[400];
(我不知道这是正确的)我如何去操作newMessage数组只使用指针。我这样做是因为C不能返回数组,但可以返回指向数组的指针。请温柔点,我是新人
你的代码几乎正确;唯一的问题是指针类型不匹配。你想要的:
char *p = newMessage;
:
char *p = &newMessage;
后者试图用char (*)[400]
类型的值初始化char *
变量p
,这是无效的c。
创建并初始化p
之后,您可以随意使用它:
p[6] = 12;
或者类似的
将指针指向数组
char* p = newMessage ;
并从函数返回。
与使用它所指向的数组相同。
newMessage[2] = ' '
p[2] = ' '
当您声明一个像static char newMessage[400]
这样的数组时,标识符newMessage
将被替换为数组的第一个元素的地址,并且它的行为类似于指针。
char* p= newMessage;
char* q= "Hi, world";
newMessage[4]= 'x';
p[4]= 'x';
*(newMessage + 2)= 0;
*(p+2)= 0;
strlen(newMessage);
strlen(q);
strcmp(newMessage, "Hi world");
strcmp(p, q);
都是有效的表达式。
注意,在最后四个函数调用中,传递的不是数组,而是指向字符串第一个字符的指针。按照惯例,函数会扫描内存,直到找到一个空字节终止符。
实际上应该是char *p = newMessage;
. char[]
的行为类似于char*
。稍后您将按照通常修改任何指针的方式来修改它。顺便说一句,这是非常基础的,所以你最好阅读教程。另外,既然你问了这个问题,如果你打算返回一个指向数组的指针,那么数组最好不要在堆栈上分配。它应该是堆分配的(在您的情况下,它是静态的)
实际上不能操作数组,因为数组在c中不是第一类类型。
几乎任何你想对数组名做的事情都会使它退化为一个指针。例外是sizeof
,所以您可以使用sizeof array/sizeof *array
获得元素计数。
你能做的是改变数组元素的值。使用指针算术和解引用*
。索引运算符a[b]
是*(a+b)
的语法糖。
还可以使用库函数(或您自己的函数),它们接受指针。