【C语言】数组传参
·
目录
数组经常被用来做函数的参数,但它的传参和接收一直是难以让人明白,以下是我的一些总结,希望对你有所帮助
- 数组传参传递的为数组第一个元素的地址
- 每个地址的大小都为4(32位平台下,64位为8,学习中接触的一般为32位)
-
数组中各元素在内存中连续存放
存在两个意外:
1.sizeof(数组名):数组名表示整个数组,计算整个数组的大小,单位是字节的
2.&数组名,数组名表示整个数组,取出的是整个数组的地址
除此之外,遇到的所有数组名都是首元素地
数组地址
int main()
{
int arr[10] = { 1,2,3,4,5,6,7 };
int* p = &arr[0];//将数组第一个元素地址赋给指针p
int i = 0;
//打印p和数组的地址
for (i = 0; i < 10; i++)
{
printf("%p = %p\n", p + i, & arr[i]);
}
return 0;
}
此时for循环内地址的变化为
整形数组传参
1.指针接收
void text(int* arr)
{
printf("%d\n", *(arr + 1));
printf("%d\n", arr[2]);
}
int main()
{
int arr[] = { 1,2,3,4,5 };
text(arr);
return 0;
}
2.数组接收
void text(int arr[])
{
printf("%d\n", *(arr + 1));
printf("%d\n", arr[2]);
}
int main()
{
int arr[] = { 1,2,3,4,5 };
text(arr);
return 0;
}
- 由此可知,整形数组传参可以使用数组和指针接收,并且可以使用数组和指针相关知识调用
字符数组传参
1.指针接收
字符数组
void text(char* arr)
{
printf("%c\n", *(arr + 1));
printf("%c", arr[2]);
}
int main()
{
char arr[] = { 'a','b','c'};
text(arr);
return 0;
}
字符串数组
void text(char* arr)
{
printf("%c\n", *(arr + 1));
printf("%c", arr[2]);
}
int main()
{
char arr[] = "abcd";
text(arr);
return 0;
}
2.数组接收
字符数组
void text(char arr[])
{
printf("%c\n", *(arr + 1));
printf("%c", arr[2]);
}
int main()
{
char arr[] = { 'a','b','c'};
text(arr);
return 0;
}
字符串数组
void text(char arr[])
{
printf("%c\n", *(arr + 1));
printf("%c", arr[2]);
}
int main()
{
char arr[] = "abcd";
text(arr);
return 0;
}
- 由此可知,字符数组和字符串数组传参可以使用数组和指针接收,并且可以使用数组和指针相关知识调用
传递数组长度
1.字符串数组
数组接收
void text(char arr[])
{
printf("%d", strlen(arr));//strlen函数用来求字符串长度
}
int main()
{
char arr[] = "abcdef";
text(arr);
return 0;
}
指针接收
void text(char* arr)
{
printf("%d", strlen(arr));//strlen函数用来求字符串长度
}
}
int main()
{
char arr[] = "abcdef";
text(arr);
return 0;
}
- 由此可知,当字符串数组传参时,可以在定义数组函数外得到数组长度
2.字符数组
数组接收
void text(char arr[])
{
printf("传值函数内求数组长度:%d\n", sizeof(arr)/sizeof(arr[0]));
}
int main()
{
char arr[] = { 'a','b','c' ,'d','e','f'};
printf("主函数内求数组长度:%d\n", sizeof(arr) / sizeof(arr[0]));
text(arr);
return 0;
}
指针接收
void text(char* arr)
{
printf("传值函数内求数组长度:%d\n", sizeof(arr)/sizeof(arr[0]));
}
int main()
{
char arr[] = { 'a','b','c' ,'d','e','f'};
printf("主函数内求数组长度:%d\n", sizeof(arr) / sizeof(arr[0]));
text(arr);
return 0;
}
- 由此可知,字符数组传参时,只能在定义数组函数内获得数组长度
- 一块地址的大小为4,字符型变量的大小为1,在其它函数内求得大小为4
3.整形数组
数组接收
void text(int arr[])
{
printf("传值函数内求数组长度:%d\n", sizeof(arr)/sizeof(arr[0]));
}
int main()
{
int arr[] = { 1,2,3,4,5 };
printf("主函数内求数组长度:%d\n", sizeof(arr) / sizeof(arr[0]));
text(arr);
return 0;
}
指针接收
void text(int* arr)
{
printf("传值函数内求数组长度:%d\n", sizeof(arr)/sizeof(arr[0]));
}
int main()
{
int arr[] = { 1,2,3,4,5 };
printf("主函数内求数组长度:%d\n", sizeof(arr) / sizeof(arr[0]));
text(arr);
return 0;
}
- 由此可知,整形数组传参时,只能在定义数组函数内获得数组长度
4.问题原因
查阅一些资料和其它博客,发现数组无法在其它函数确定长度的主要原因为
- sizeof 是在编译的时候求值的,所以不能够动态的确定一个变量的值。
- 数组作为参数传入函数是以指针的形式(首地址),所以系统是不知道该数组是在哪里截止的,因此不会得到数组的长度
- 整形数组传递的是首元素的地址,所以sizeof(arr) / sizeof(arr[0])的值为1
- 字符型数组每个元素的大小都为1,而所有的地址的大小为4(32位平台下),所以sizeof(arr) / sizeof(arr[0])的值为4
- 而字符串它的结束标志是'\0’,strlen函数会在计算字符串长度时,遇到'\0'时停止计算字符串的长度,所以字符串可以在传参后使用strlen函数计算长度
总结:
- 数组传参时不论字符串、字符、整形都可以使用数组和指针接收,并且利用相关知识调用
- 字符串数组可以不传递数组长度,其它类型的数组需要传递数组长度
引用:我们都在for循环,区别在于你是什么情况下break的。
更多推荐
已为社区贡献3条内容
所有评论(0)