C语言数组基础知识

目录

一维数组:

一维数组的创建:

一维数组的访问:

一维数组在内存中的存储:

二维数组:

二维数组的创建:

二维数组的初始化:

二维数组的使用:

二维数组在内存中的存储:

数组作为函数参数:

但是,数组名是首元素地址的情况有两个例外:

冒泡排序的实例应用:


一维数组:

一维数组的创建:

数组是一组相同类型的元素的集合。

type_t arr_name[const_n];

type_t是指数组的元素类型

const_n是一个常量表达式(不能初始化变量n作为常量表达式,只有C99标准支持变长数组),用来指定数组的大小

int arr[10]={1,2,3,4,5,6,7,8,9,10};//完全初始化
int arr[10]={1,2,3,4,5};//不完全初始化,后面的值为0;
int arr[]={1,2,3,4,5};   //等价于 int arr[5]={1,2,3,4,5};  
char ch[]={'b','i','t'};//三个元素
char ch[]=“bit”;//四个元素,因为字符串末尾自带'\0'
int main() {
	char ch1[] = "bit";
	char ch2[] = { 'b','i','t' };
	printf("%s\n", ch1);
	printf("%s\n", ch2);

	return 0;
}

这段代码的运行结果为:

C语言数组基础知识_第1张图片

原因是字符串“bit”中有结束字符‘\0’.而ch2中没有结束字符导致继续读取随机值(这种情况下求字符串长度也会出错)


一维数组的访问:

(1)数组是使用下标来访问的,下标是从0开始的

(2)数组的大小可以通过计算得到

int sz = sizeof(arr) / sizeof(arr([0]));

一维数组在内存中的存储:

//%p - 是按地址的格式打印 - 十六进制的打印
int main() {
	int arr[10] = { 0 };
	for (int i = 0; i < 10; i++) {
		printf("arr[%d]=%p\n", i, &arr[i]);
	}
	return 0;
}

这段代码运行结果为:

C语言数组基础知识_第2张图片

所以:

(1)一位数组在内存中是连续存放的(所以可以用指针访问)

(2)随着数组下标的增长,地址是由低到高变化的


二维数组:

二维数组的创建:

int arr [3][4];
char arr[3][4];


二维数组的初始化:

int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//完全初始化

C语言数组基础知识_第3张图片

int arr[3][4] = { 1,2,3,4,5,6,7 };//不完全初始化

C语言数组基础知识_第4张图片

int arr[3][4] = { {1,2},{3,4},{5,6} };//每行填充两个元素
//因为初始化了三行,所以可以省略行数
//所以等价于int arr[][4] = { {1,2},{3,4},{5,6} };

C语言数组基础知识_第5张图片


二维数组的使用:

int main() {
	//int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };//完全初始化
	//int arr[3][4] = { 1,2,3,4,5,6,7 };//不完全初始化
	int arr[3][4] = { {1,2},{3,4},{5,6} };
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 4; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

运行结果为:

C语言数组基础知识_第6张图片


二维数组在内存中的存储:

int main() {

	int arr[3][4] = { {1,2},{3,4},{5,6} };
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 4; j++) {
			printf("arr[%d][%d]=%p\n", i,j,&arr[i][j]);
		}
	}
	return 0;
}

运行结果为:

C语言数组基础知识_第7张图片

所以:

(1)二维数组在内存中也是连续存放的(行内部连续,跨行也是连续的)

如图:

C语言数组基础知识_第8张图片

(2)二维数组也可以定义指针访问


数组作为函数参数:

数组作为函数参数传入,传入的是数组首元素的地址,等价于指针

int main() {
	int arr[10] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", &arr[0]);

	return 0;
}

运行结果为:

C语言数组基础知识_第9张图片

但是,数组名是首元素地址的情况有两个例外

(1)sizeof(数组名) 数组名表示整个数组-计算的是整个数组的大小,单位是字节

但在函数中接受传入的形参数组时,sizeof(形参数组)计算的是数组首地址元素的大小, 这一块具体可查看博主的相关博客C中关于能否在函数中求传入整型数组长度的问题

(2)&数组名 - 数组名表示整个数组 - 取出的是整个数组的地址(但与数组首元素地址一样,但意义不同),这一块具体可查看博主的相关博客C中数组名代表首元素地址的两个例外

冒泡排序的实例应用:
#include 
#include 
#include 
#include
#include  
void bubble(int brr[], int len) {
	for (int i = 0; i < len - 1; i++) { //一共进行几趟冒泡排序
		bool flag = false;              //用于判断本趟冒泡排序是否发生了元素的交换
		for (int j = len - 1; j > i; j--) {//每趟冒泡排序要进行几次交换
			if (brr[j] > brr[j - 1]) {
				int tmp = brr[j - 1];
				brr[j - 1] = brr[j];
				brr[j] = tmp;             //交换元素
				flag = true;              //本趟排序发生了元素的交换
			}
			if (flag == false) {
				return;
			}
		}
	}
}
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble(arr, sz);
	for (int i = 0; i < 10; i++) {
		printf("%d ", arr[i]);
	}
	return 0;
}

运行结果为:

C语言数组基础知识_第10张图片

你可能感兴趣的:(C语言基础知识贴,c语言,开发语言,学习,数据结构,算法)