1.参数构成:
char * strcpy ( char * destination, const char * source );
这是cplusplus.com给出的strcpy函数的标准参数形式,我们发现两个参数类型都是指针类型,但是实际使用过程中,strcpy函数的第一个形参,通常情况下却只能是数组名,而不能是指针变量。
char *p="1234";
char *q="abcd";
char str1[6]="Hello";
char str2[6]="World";
1.strcpy(p,q);
2.strcpy(p,str1);
3.strcpy(str1,p);
4.strcpy(str1,str2);
在运行过程中 1. 和 2. 都会报错,因为p,q都是指向了常量区字符串的首地址(一个只读内存区域),常量是不能被修改的,所以我们在将指针q和str1中的内容拷贝到指针p指向的存储区时会出错。
char str1[6]="Hello" 字符数组str1拷贝了常量区字符串“abcd”的值,因此在 3. 和 4. 中并不是直接修改了存储在常量区的字符串''Hello'',而是修改了存储在字符数组str1中常量区字符串''Hello''的拷贝。
2.总结:
对于 strcpy 函数的第一个参数(输出型参数),它可以是数组名或者是指针变量,只要它指向的内存区域是可写的。(最简单的就是让指针指向一个可写的数组)
示例代码:(通过动态分配内存实现)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
// 指针变量指向动态分配的内存作为输出型参数
char* p = malloc(20 * sizeof(char));
if (p == NULL) {
fprintf(stderr, "内存分配失败\n");
return -1;
}
strcpy(p, "Hello");
printf("第一次拷贝p: %s\n", p);
// 修改指针指向的内容
strcpy(p, "New World");
printf("第二次拷贝p: %s\n", p);
// 释放动态分配的内存
free(p);
return 0;
对于 strcpy 的第二个参数(输入型参数),可以是数组名或者是指针变量,因为它只是读取数据,不会修改源内存区域。