我一直在想为什么在这样的代码中:
#include <stdio.h>
#include <string.h>
int main () {
char src[40];
char dest[100];
memset(dest, '\0', sizeof(dest));
strcpy((char*)src, "This is tutorialspoint.com");
strcpy((char*)dest, src);
printf("Final copied string : %s\n", (char*)dest);
return(0);
}
字符串
需要这个(char*)
?strcpy需要数组的地址,所以只有src或dest就足够了。但是在一些代码中,人们会变成(char*)。
问题是为什么有些人在正常的src和dest也工作时这样做:
#include <stdio.h>
#include <string.h>
int main () {
char src[40];
char dest[100];
memset(dest, '\0', sizeof(dest));
strcpy(src, "This is tutorialspoint.com");
strcpy(dest, src);
printf("Final copied string : %s\n", (char*)dest);
return(0);
}
型(char*)
不是在改变char src[40]
本身吗?它包含了数据,把它变成指针数组不会混合这个,当它已经有一些数据在他里面的时候?
我的意思是src是一个地址,地址类型是变成一个指针?我不明白语法和后果,当数组有一些数据。字符现在是地址,指向什么???
3条答案
按热度按时间55ooxyrt1#
需要这个
(char*)
吗?不,没有必要。
char[40]
(array)* 衰减 * 为传递给函数时指向数组中第一个元素的指针。指向数组中第一个元素的指针的类型为char*
,这正是函数所需要的。(char*)
不是改变了数组charsrc[40]
本身吗?不,这只是一个不必要的石膏。
ddarikpa2#
除了少数例外,对数组的引用会衰减为指向其第一个元素的指针。
字符串
相当于
型
同样地,
型
相当于
型
在这两种情况下,你最终都会得到一个
char *
类型的指针,它指向src
的第一个元素。强制转换是不必要的,应该避免。1.值得注意的例外:
sizeof( a )
和&a
8ehkhllq3#
演员阵容是不必要的。
strcpy
的第一个参数的类型应该是char *
。参数src
的类型是char
,数组在使用表达式 decay 时指向指向它的第一个元素的指针,所以这样的指针的类型应该是char *
。所以传递给函数的是一个
char[]
,它衰减为一个char *
,它匹配函数所期望的,所以不需要强制转换。