C语言数组知识点(一维 二维数组,传参)

Posted 两片空白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言数组知识点(一维 二维数组,传参)相关的知识,希望对你有一定的参考价值。

一.数组的创建与初始化

数组是一组相同类型函数的集合

1.一维数组的创建

一维数组

创建方式:元素类型 + 数组名 + [常量表达式]

一维数组创建实例:

//代码1
char arr [10];
int brr [5];

//代码2
int count = 5;
int a[count];
//这样创建是错误的

注: 数组创建时,常量表达式一定要给一个常量,不能使用变量。

2.一维数组的初始化

数组的初始化是指在数组创建的同时给数组内容一些合理的初始值。

例子:

int arr1 [3] = { 1,2,3 };
int arr2 [4] = {0};
char arr2 [] = {'a','b','c'};
char arr3 [] = "hellow";

注:1.像arr2[4]这样初始化时,’{}‘花括号中的元素个数与’[]‘中括号里的元素个数不符时,系统会将其它元素个数用0代替。

1.数组创建时如果不指定元素的个数,就得初始化。数组元素个数根据初始化内容来确定。例子中arr2[ ]的元素个数为3。

2.数组可以用来存储字符串,由于字符串以‘\\0’结尾,例子中arr3[ ]的元素个数为7。

3.数组只能被整体初始化,不能被整体赋值。赋值一般通过循环来完成。

例如:

//代码1
int a [3] = {1,2,3};
//代码2
int b [3];
b[3]={0,1,2};   //是错误的

//正确的
int i=0;
int b[3];
for(;i<3;i++){
    b[i]=i;
}

二.一维数组在内存中的存储

首先看代码:

#include<stdio.h>
int main(){
	int arr[3] = { 0 };
	int i = 0;
	for (i = 0; i<sizeof(arr) / sizeof(arr[0]); ++i)
	{
		printf("&arr[%d] = %p\\n", i, &arr[i]);
	}
	return 0;
}

输出:

仔细观察输出结果可以看出,随着数组下标的增长,元素的地址,也有规律的递增。由于上述代码中数组定义为整形(int),在内存中占4字节。输出地址也是按4字节递增,由此看出数组在内存中存放是连续递增并且线性的。如图:

 

三.二维数组的创建与初始化

通过对一维数组的来了解,再来对二维数组,甚至多维数组理解就更加容易,因为由很多共性,只是稍加变形。

二维数组

创建方式:元素类型 + 数组名 + [常量表达式] [常量表达式]

1.二维数组的创建

int arr1[3][4];
char arr2[2][3];

2.二维数组的初始化

二维数组初始化与一维数组初始化大致相同,也是通过循环的方式,只不过是多了一层循环。如下代码:

#include<stdio.h>
int main(){
	int arr[3][2]= { 0 };
	int i = 0;
	for (i = 0; i<3; ++i)
	{
		int j = 0;
		for (; j < 2; ++j){
			arr[i][j] = i * 2 + j;
		}
	
	}

	return 0;
}

四.二维数组在内存中的存储

如下代码:

#include<stdio.h>
int main(){
	int arr[3][4];
	int i = 0;
	for (i = 0; i<3; i++)
	{
		int j = 0;
		for (j = 0; j<4; j++)
		{
			printf("&arr[%d][%d] = %p\\n", i, j, &arr[i][j]);
		}
	}
	return 0;
}

输出结果为:

通过输出我们发现二维数组在内存的保存依然与一维数组相同,是连续线性且递增的。由此我们在理解上可以将二维数组甚至多维数组都理解成一个以为数组。只不过这个一维数组中元素是数组。即二维数组看作以为数组后,里面的元素为一维数组。

注:arr——代表数组的起始地址,arr[0][0]——代表首元素的地址     当代码显示时两个地址代码相同,但是代表的意义不同,类型不同。

#include<stdio.h>

int main(){
	int arr[3][4];
	printf("arr[0][0]:%p\\n", &arr[0][0]);
	printf("arr[0][1]:%p\\n", &arr[0][0]+1);
	printf("arr:      %p\\n", &arr);
	printf("arr:      %p\\n", &arr+1);
	return 0;
}

输出结果:

arr代表整个数组,而arr[0[0]代表首元素。arr只有两种情况代表整个数组,当sizeof单独使用arr时,‘&‘取地址符号单独使用arr时。其它代表首元素地址。

五.数组传参

由于当调用函数时会在内存的栈结构中形成栈帧,开辟空间,存储变量等。而为了降低成本,当数组作为函数进行传参时会发生降维,并且降维成指向数组内部元素类型的指针。

#include<stdio.h>

void show(int arr[]){
	int num = sizeof(arr) / sizeof(arr[0]);
	printf("show:%d\\n", num);
}


int main(){
	int arr[] = {1,2,3,4,5};
	int num = sizeof(arr) / sizeof(arr[0]);
	printf("main:%d\\n", num);
	show(arr);
	return 0;
}

输出结果:

 

以上是关于C语言数组知识点(一维 二维数组,传参)的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶5——指针的进阶

深入理解C语言的指针

详解C语言指针

C语言进阶笔记深入了解进阶指针

C语言进阶笔记深入了解进阶指针

C语言进阶笔记深入了解进阶指针