数组(c语言进阶)


一.数组的创建

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

格式

数组的类型 数组名 数组的大小

cs 复制代码
int arr[20];
char arr[20];

注意:在VS编译器中数组的大小必须是常量


二.数组的初始化

cs 复制代码
//这是个整形数组初始化
int arr[20] ={0}
//如果右边的值已经给了,那么方括号里面就不要写元素个数了
char ch1[]="abc"

char ch2[]={'a','b','c'}

1.这俩个方式区别

字符串中有\0,sizeof计算的时候把\0也计算进去了,所以是4

二.打印这俩种数组

cs 复制代码
int main()
{
	char ch1[] = "abc";
	char ch2[] = { 'a','b','c' };
	printf("%s\n", ch1);
	printf("%s\n", ch2);
	return 0;
}

代码运行

为什么呢

字符串后面有\0,\0是字符串结束的标志👇

而这个后面没有\0👇

以这个打印时会继续往后访问,直到找到\0为止


在字符数组元素中写成数字,会转成ASCII值


三.一维数组在内存中存储

cs 复制代码
int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++)
	{
		printf("arr[%d]=%p\n", i,&arr[i]);
	}
	return 0;
}

程序运行👇

由此可见,1.数组在内存中是连续存放的。

因为1个int是4个字节,arr3->arr4刚好是垮了4个字节

2.随着下标的增大,地址是由低到高变化的。

1.用地址来遍历数组中的地址

cs 复制代码
int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = &arr[0];
	for (i = 0; i < sz; i++)
	{
		//因为数组在内存中是连续存放的,所以每次
		//加1个整形,加4个字节,也就访问到了下一个数组的元素
		printf("%p\n", p + i);
	}
	return 0;
}

程序运行👇

p+i与&arri效果是一样的

2.对地址进行解引用从而遍历了数组

四.数组中有关地址的误区

1.数组名是数组首元素的地址

俩个例外

1.sizeof(数组名),数组名如果单独放在sizeof内部,这里的数组名表示整个数组,计算的是整个数组的大小

2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

cs 复制代码
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//数组名代表首元素的地址
	printf("%p\n", arr);
	printf("%p\n", arr + 1);
	printf("%p\n", &arr[0]);
	printf("%p\n", &arr[0] + 1);
	//&arr,取出的是整个数组的地址
	printf("%p\n", &arr);
	printf("%p\n", &arr + 1);
	return 0;
}

解释

五.二维数组

1.二维数组的创建

cs 复制代码
int arr[3][4];
char arr[3][5];
double arr[3][4];

2.二维数组的初始化

cs 复制代码
int arr[3][4] ={ 1,2,3,4 };
int arr[3][4] ={{1,2},{3,4}};
//行可以省略,列不能省略
//左边是行,右边是列
int arr[][4] ={{2,3},{4,5}};

理解如下


3.二维数组的访问


4.二维数组的遍历

%2d实现的是右对齐👇

%-2d实现的是左对齐👇

5.二维数组在内存中连续存储

二维数组在内存中是连续存放的

六.数组的越界

数组的下标是有范围限制的。 数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。 所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。 C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,


结语:

限于水平,本篇文章不足之处在所难免,如有错误,请大家纠正下,谢谢!

相关推荐
这不小天嘛14 小时前
JAVA八股——J集合篇
java·开发语言
AOwhisky14 小时前
Python 学习笔记(第一期与第二期)——基础语法——核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发
ysu_031415 小时前
06 | 200个单元测试C项目也能TDD
c语言·单元测试·tdd
喜欢的名字被抢了17 小时前
Python实战:SQLAlchemy ORM与FastAPI项目集成
开发语言·python·sql·教程·fastapi
从零开始的代码生活_19 小时前
C++ 内存管理:从内存分区到 new/delete 底层原理
开发语言·c++·后端
wabs66619 小时前
关于单调栈【力扣739.每日温度的思考】
java·开发语言
AOwhisky19 小时前
Python 学习笔记(第三期)——流程控制核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发·流程控制
逆向编程20 小时前
Socket异常连接自动清理方案
开发语言
va学弟21 小时前
Java 网络通信编程(10):Channel 和 Selector
java·开发语言
爱吃提升1 天前
MATLAB impulse函数脉冲响应完整实操教程
开发语言·matlab