数组的退化
数组退化
数组退化只发生在函数传参中
在函数声明时如果参数有数组的时候常常会出现两种表示方式:
如最常见的main函数:
使用 char **argv
int main(int argc, char **argv) { // ... }
使用 char *argv[]
int main(int argc, char *argv[]) { // ... }
由于数组的退化(或称为数组到指针的转换)特性,在函数参数中,数组类型的参数会转换为指向数组第一个元素的指针。这种转换在C语言中是自动发生的,因此在函数原型和定义中,char *argv[] 和 char **argv 是等价的.
当数组作为参数传递给函数时,编译器只会传递数组的基地址(即第一个元素的地址),而不是整个数组的内容。这是因为传递整个数组可能会导致大量的数据拷贝,这在性能上是不划算的,而且很多时候函数并不需要整个数组的内容。
在函数内部,argv 被视为一个指向指针的指针(char **),你可以通过这个指针来访问命令行参数数组中的每一个字符串(实际上是C风格的字符串,即字符数组)。argc 参数告诉你有多少个这样的字符串(包括程序本身的名称)。
但在其他上下文中(如函数内部或全局变量的声明),它们可能有不同的含义。在函数内部或全局变量的声明中,char *argv[] 明确表示一个数组,而 char **argv 表示一个指向指针的指针。
在函数中中获取数组的长度方法
当需要在接受参数的函数中获取函数参数的长度时可选方法有:
1、将数组长度作为另一个参数传递给函数:
void recArray(int arr[], int size) {
//****
}
int main() {
int myArray[] = {1, 2, 3};
int size = sizeof(myArray) / sizeof(myArray[0]);
recArray(myArray, size);
return 0;
}
2、使用结构体封装数组和长度:
typedef struct {
int *data;
int size;
} Array;
void recArray(Array arr) {
//handle array
}
int main() {
int myArray[] = {1, 2, 3};
Array myStruct = {myArray, sizeof(myArray) / sizeof(myArray[0])};
recArray(myStruct);
return 0;
}