为什么使用strcpy数组必须改为(*)

yjghlzjz  于 2023-11-16  发布在  其他
关注(0)|答案(3)|浏览(84)

我一直在想为什么在这样的代码中:

#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是一个地址,地址类型是变成一个指针?我不明白语法和后果,当数组有一些数据。字符现在是地址,指向什么???

55ooxyrt

55ooxyrt1#

需要这个(char*)吗?
不,没有必要。char[40](array)* 衰减 * 为传递给函数时指向数组中第一个元素的指针。指向数组中第一个元素的指针的类型为char*,这正是函数所需要的。
(char*)不是改变了数组char src[40]本身吗?
不,这只是一个不必要的石膏。

ddarikpa

ddarikpa2#

除了少数例外,对数组的引用会衰减为指向其第一个元素的指针。

strcpy( src, ... )

字符串
相当于

strcpy( &(src[0]), ... )


同样地,

strcpy( (char*)src, ... )


相当于

strcpy( (char*)&(src[0]), ... )


在这两种情况下,你最终都会得到一个char *类型的指针,它指向src的第一个元素。强制转换是不必要的,应该避免。
1.值得注意的例外:sizeof( a )&a

8ehkhllq

8ehkhllq3#

演员阵容是不必要的。
strcpy的第一个参数的类型应该是char *。参数src的类型是char,数组在使用表达式 decay 时指向指向它的第一个元素的指针,所以这样的指针的类型应该是char *
所以传递给函数的是一个char[],它衰减为一个char *,它匹配函数所期望的,所以不需要强制转换。

相关问题