【C语言】数组传参

目录

 

数组地址

整形数组传参

1.指针接收

2.数组接收

字符数组传参

1.指针接收

字符数组

字符串数组

2.数组接收

字符数组

 字符串数组

传递数组长度

1.字符串数组

数组接收

指针接收

2.字符数组

数组接收

指针接收

3.整形数组

数组接收

 指针接收

4.问题原因

总结:


     数组经常被用来做函数的参数,但它的传参和接收一直是难以让人明白,以下是我的一些总结,希望对你有所帮助


  • 数组传参传递的为数组第一个元素的地址
  • 每个地址的大小都为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;
}

da18a65d83604a228eab8cf0cc4717bc.png

 此时for循环内地址的变化为

a454332ae95e42788397fefcb5b7412e.png

 

 

 

整形数组传参

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;
}

6c08e7ee42b3424ba780f6c43f84ea1a.png

 

 

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;
}

d217429c2b4446319ba0c883578301e5.png

  •  由此可知,整形数组传参可以使用数组和指针接收,并且可以使用数组和指针相关知识调用

 

 

字符数组传参

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;
}

f6271a2c571f434d9909470b8fd28640.png

字符串数组

void text(char* arr)
{
	printf("%c\n", *(arr + 1));
	printf("%c", arr[2]);
}

int main()
{
	char arr[] = "abcd";

	text(arr);

	return 0;
}

ae6347d8859043f0b090630ed452c4c5.png

 

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;
}

02cea56b3a83420f8ad8a8ea94df77d8.png

 字符串数组

​void text(char arr[])
{
	printf("%c\n", *(arr + 1));
	printf("%c", arr[2]);
}

int main()
{
	char arr[] = "abcd";

	text(arr);

	return 0;
}

cf29a55dc2664a99a204f306e2c5773e.png

  •  由此可知,字符数组和字符串数组传参可以使用数组和指针接收,并且可以使用数组和指针相关知识调用

 

 

传递数组长度

1.字符串数组

数组接收

void text(char arr[])
{
	printf("%d", strlen(arr));//strlen函数用来求字符串长度
}

int main()
{
	char arr[] = "abcdef";

	text(arr);

	return 0;
}

f6a0b1c2c63243b095a4cb3be9ffdbb1.png

指针接收

void text(char* arr)
{
	printf("%d", strlen(arr));//strlen函数用来求字符串长度
}
}

int main()
{
	char arr[] = "abcdef";

	text(arr);

	return 0;
}

a794333c9249441098e7aada1025060e.png

  •  由此可知,当字符串数组传参时,可以在定义数组函数外得到数组长度

 

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;
}

22cc3cb92bfb4ebcba34cfc4a8f88d76.png

指针接收

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;
}

b80257006dd041eeb9f54e537cb9568e.png

  • 由此可知,字符数组传参时,只能在定义数组函数内获得数组长度
  • 一块地址的大小为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;
}

00dc36f9170649f58b913e509ffd3b63.png

 指针接收

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;
}

99ff2a20cf3144bca49561e8360abd70.png

  •  由此可知,整形数组传参时,只能在定义数组函数内获得数组长度

 

4.问题原因

查阅一些资料和其它博客,发现数组无法在其它函数确定长度的主要原因为

  • sizeof 是在编译的时候求值的,所以不能够动态的确定一个变量的值。
  • 数组作为参数传入函数是以指针的形式(首地址),所以系统是不知道该数组是在哪里截止的,因此不会得到数组的长度
  • 整形数组传递的是首元素的地址,所以sizeof(arr) / sizeof(arr[0])的值为1
  • 字符型数组每个元素的大小都为1,而所有的地址的大小为4(32位平台下),所以sizeof(arr) / sizeof(arr[0])的值为4
  • 而字符串它的结束标志是'\0’strlen函数会在计算字符串长度时,遇到'\0'时停止计算字符串的长度,所以字符串可以在传参后使用strlen函数计算长度

 

总结:

  1. 数组传参时不论字符串、字符、整形都可以使用数组和指针接收,并且利用相关知识调用
  2. 字符串数组可以不传递数组长度,其它类型的数组需要传递数组长度

 

引用:我们都在for循环,区别在于你是什么情况下break的。

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榶曲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值