目录

 

数组地址

整形数组传参

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

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_数组长度

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

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_数组_02

 

 

 

整形数组传参

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

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_数组_03

 

 

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

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_数组长度_04

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

 

 

字符数组传参

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

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_c语言_05

字符串数组

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

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

	text(arr);

	return 0;
}

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_字符数组_06

 

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

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_字符数组_07

 字符串数组

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

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

	text(arr);

	return 0;
}

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_c语言_08

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

 

 

传递数组长度

1.字符串数组

数组接收

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

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

	text(arr);

	return 0;
}

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_数组长度_09

指针接收

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

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

	text(arr);

	return 0;
}

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_字符数组_10

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

 

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

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_数组_11

指针接收

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

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_数组_12

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

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_c语言_13

 指针接收

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

传数组参数时报错 invalid memory address or nil pointer dereference 数组的传参_字符数组_14

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

 

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的。