c语言#include <stdio.h> #include <string.h> void main() { char p1[10]="abc",*p2="ABC",str[50]="xyz";

2024-11-20 09:23:19
推荐回答(5个)
回答1:

char p1[10]="abc",*p2="ABC",str[50]="xyz";

上面的语法是变量定义并初始化,p1[10]、str[50]是同一种类型为“char数组”,他们长度是固定的,而*p2则是另一种数据类型为“char指针”,可以指向字符串,长度不固定。
这两种变量本质是一样的,都是字符指针,都可以通过下标或偏移取值:p1[1]、*(p1+1),
所以*p1、*str、*p2从语法上说都是对的,都会取到第一个字符。
strcpy(str+2,strcat(p1,p2)); 可以拆分成两个语句理解:
strcat(p1,p2) 和并p1、p2结果是abcABC
strcpy(str+2,strcat(p1,p2)); 等同于strcpy(str+2,"abcABC");
就是把"abcABC“拷贝到str的第二个 字符后面,覆盖第三个字符及之后的数据,
所以结果就是xyabcABC。

回答2:

首先回答你第一个问题:*p2正确是因为在你后面的使用过程中,没有对其进行赋值,而*p1和*str本身是没有内存空间的,它只是本身自带了四个字节在堆区,所以你在后面用strcat(p1,p2)和strcpy(str+2,...)时使用*p1和*str就会报出段错误即没有空间
第二个问题:strcat(p1,p2)则它的返回值为abcABC,然后strcpy(str+2,strcat(p1,p2)),由于str+2那么str就相当于从z开始了,然后你内存拷贝,所以最后的结果是xyabcABC。。。
建议你去百度下内存分配问题

回答3:

extern char *strcat(char *dest,char *src);
extern char *strcpy(char *dest,const char *src);
因为strcat(p1,p2)这个调用是将p2接到p1后面,p1的大小要确定且大小要足够。strcpy的调用也是一样。所以P1与str要指明大小。

回答4:

*p1[10]是指向数组的指针,p1【10】是数组,而你的值是个字符串

回答5:

强制改变类型~