C语言-数组

1,数组:一组相同类型元素的集合

复制代码
#include<stdio.h>

//数组:一组相同类型元素的集合
int main() {

	//下面的代码只能在支持C99标准的编译器上编译
	int n = 10;
	scanf("%d", &n);
	int arr2[n];//这种数组是不能初始化的

	return 0;
}

2,一维数组的初始化

复制代码
#include<stdio.h>
//一维数组的初始化
int main() {
	//初始化(分为完全初始化和不完全初始化)
	int arr[10] = { 1,2,3 };//不完全初始化,剩余元素默认初始化为0
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,0 };//完全初始化
	int arr2[] = [1, 2, 3];

	char ch1[10] = { 'a','b','c' };//a b c  0  0 0 0 0 0 0
	char ch2[10] = "abc";          //a b c \0  0 0 0 0 0 0
	char ch3[] = { 'a','b','c' };  //a b c
	char ch4[] = "abc";            //a b c \0
	return 0;
}

3,一维数组的使用

复制代码
#include<stdio.h>
//一维数组的使用
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	//下标          0 1               9  
	//[] -> 下标引用操作符
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);//10
	//正打印
	//for ( i = 0; i < sz; i++)
	//{
	//	printf("%d ", arr[i]);
	//}
	//倒打印
	for (i = sz-1; i >=0; i--)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

4,一维数组在内存中的使用(数组在内存中是连续存放的)

复制代码
#include<stdio.h>
//一维数组在内存中的使用(数组在内存中是连续存放的)
int main() {
	int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
	//下标          0 1               9  
	//[] -> 下标引用操作符
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);//10
	//打印数组每个元素的地址
	for ( i = 0; i < sz; i++)
	{
		printf("&arr[%d] = %p\n", i, &arr[i]);	//打印出来的每个地址差4
	}
	
	return 0;
}

5,二维数组的初始化(可以省略行数,但不能省略列数)

复制代码
#include<stdio.h>
//二维数组的初始化(可以省略行数,但不能省略列数)
int main() {
	int arr1[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };
	//第一行:1 2 3 4  第二行:2 3 4 5  第三行:3 4 5 6

	int arr2[3][4] = { 1,2,3,4,2,3,4,5,3,4};
	//第一行:1 2 3 4  第二行:2 3 4 5  第三行:3 4 0 0  (注意:补0了)
	
	int arr3[3][4] = { {1,2},{3,4},{5,6} };
	//第一行:1 2 0 0  第二行:3 4 0 0  第三行:5 6 0 0  (注意:补0了)
	return 0;
}

6,二维数组的打印

复制代码
#include<stdio.h>
//二维数组的打印
int main() {
	int arr1[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };
	int i = 0;
	//也可以重新初始化
	//for (i = 0; i < 3; i++)
	//{
	//	int j = 0;
	//	for (j = 0; j < 4; j++)
	//	{
	//		scanf("%d",&arr[i][j]);
	//	}
	//	printf("\n");
	//}
	for ( i = 0; i < 3; i++)
	{
		int j = 0;
		for ( j = 0; j < 4; j++)
		{
			printf("arr1[%d][%d] = %d ",i,j,arr1[i][j]);
		}
		printf("\n");
	}
	return 0;
}

7,二维数组在内存中的存储

复制代码
#include<stdio.h>
//二维数组在内存中的存储
int main() {
	int arr1[3][4] = { 1,2,3,4,2,3,4,5,3,4,5,6 };
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("&arr1[%d][%d] = %p\n", i, j, &arr1[i][j]);
		}
	}
	return 0;
}

8,数组传参的时候,形参有2种写法

复制代码
#include<stdio.h>
//数组传参的时候,形参有2种写法
//1,数组  int arr[]
//2,指针  int *arr
void bubble_sort(int arr[],int sz) {//冒泡排序(核心思想:两个相邻的元素进行比较)
	
	//int sz = sizeof(arr) / sizeof(arr[0]);//注意;这句话出现在这里是错误的
	//趟数
	int i = 0;
	for ( i = 0; i < sz-1; i++)
	{
		//一趟冒泡排序
		int j = 0;
		for ( j = 0; j < sz-1-i; j++)
		{
			//交换
			int tmp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = tmp;
		}
	}
}
//把数组的数据排成升序
int main() {
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	//冒泡排序的算法,对数据进行排序
	bubble_sort(arr,sz);
	int i = 0;
	for ( i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

9,数组名

复制代码
#include<stdio.h>
//数组名
//数组名确实能表示首元素的地址
//但是有2个例外
//1,sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
//2,&数组名,这里的数组名表示的是整个数组,取出的是整个数组的地址
int main() {
	int arr[10] = { 0 };
	//下面的三句话输出内容完全相同
	//printf("%p\n", arr);
	//printf("%p\n", &arr[0]);
	//printf("%p\n", &arr);

	printf("%p\n", arr);//arr就是首元素的地址
	printf("%p\n", arr+1);
	printf("-------------------------------\n");
	printf("%p\n", &arr[0]);//首元素的地址
	printf("%p\n", &arr[0]+1);
	printf("-------------------------------\n");
	printf("%p\n", &arr);//数组的地址
	printf("%p\n", &arr+1);//和上面的两句话不同,差了整个数组
	//int n = sizeof(arr);//40
	//printf("%d\n", n);
	return 0;
}

10,二维数组的命名

复制代码
#include<stdio.h>
//二维数组的命名
int main() {
	int arr[3][4] = { 0 };

	//求二维数组行数
	printf("%d\n", sizeof(arr) / sizeof(arr[0])); //arr[0] 表示数组一整行元素的大小 
	//求二维数组列数
	printf("%d\n", sizeof(arr[0]) / sizeof(arr[0][0]));

	int sz = sizeof(arr);
	printf("%d\n", sz);

	printf("%p\n", arr);//二维数组的数组名也表示数组首元素的地址
	printf("%p\n", arr + 1);
}
相关推荐
临溟夜空的繁星17 小时前
C++ STL-- vector
开发语言·c++
XiYang-DING17 小时前
【Java SE】Java代码块详解
java·开发语言·python
摇滚侠17 小时前
Java SpringBoot 项目,项目启动后执行的方法,有哪些方式实现
java·开发语言·spring boot
哈哈很哈哈18 小时前
逻辑回归Logistic Regression
算法·机器学习·逻辑回归
甄心爱学习18 小时前
【极大似然估计/最大化后验】为什么逻辑回归要使用交叉熵损失函数
算法·机器学习·逻辑回归
艾莉丝努力练剑18 小时前
【Linux进程间通信:共享内存】为什么共享内存的 key 值由用户设置
java·linux·运维·服务器·开发语言·数据库·mysql
Reisentyan18 小时前
GoLang Learn Data Day 0
开发语言·rpc·golang
Chengbei1118 小时前
AI 自动逆向 JS 加密!自动抓密钥、出报告,彻底解放双手,解决抓包数据包加密难题
开发语言·javascript·人工智能·安全·网络安全·网络攻击模型
01二进制代码漫游日记18 小时前
C/C++中的内存区域划分
c语言·jvm·数据结构·学习
天若有情67318 小时前
【实战】从零开发企业级 B 端风格字符串值管理系统(Python+MySQL)
开发语言·python·mysql·企业级应用·b端应用