ОП "Когда массив отправляется ..." нуждается в пояснении.
Когда массив отправляется (через параметр) по значению в функцию, создается новый указатель, поэтомуизменение массива внутри функции не изменит исходный массив, но изменение значений массива внутри функции (поскольку у нас есть указатель на исходный массив) изменит значения в исходном массиве.(OP)
Когда массив, такой как s[]
ниже, передается в strcpy(char *s1, const char *s2)
, происходит преобразование first .Объект s
преобразуется в адрес первого элемента массива.strcpy()
не получает s[]
в качестве параметра s1
, вместо этого он получает копию значения &s[0]
.
char s[6] = "Hello";
strcpy(s, "World");
В пределах strcpy()
, s1
не является массив .s1
- указатель на char
.strcpy()
не имеет понятия «изменение массива внутри функции», так как функция не знает, s1
указывает на память массива, выделенную память или что-либо еще.strcpy()
понимает s1
указывает на char
.
Означает ли третья точка, что поле массива структуры при отправке в функцию будет полностью клонировано?
Да.Когда объект передается функции в C, он потенциально конвертируется и затем передается по значению.Это очень похоже на любое задание.Содержимое объекта после преобразования копируется в место назначения.После преобразования не имеет значения, является ли объект struct, union, int, double, void*, int(*)()
и т. Д. Или a struct
, содержащий массив .
int a;
double b;
a = 5; // 5 is copied to a
b = a; // a is converted to double and copied to b
char s[6] = "Hello";
char *e;
void *v;
e = s; // s is converted to the address on the first array element and then copied to e
v = e; // e is converted to a `void*` and then copied to v
Struct_t f = {0};
Struct_t g;
g = f; // f is copied to g