数组(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个字节,arr[3]->arr[4]刚好是垮了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与&arr[i]效果是一样的

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语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的,


结语:

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

相关推荐
念何架构之路9 分钟前
Go语言常见并发模式
开发语言·后端·golang
磊 子31 分钟前
多态类原理+四种类型转换+异常处理
开发语言·c++·算法
脆皮炸鸡75533 分钟前
库制作与原理~动态链接
linux·开发语言·经验分享·笔记·学习方法
XMYX-034 分钟前
26 - Go recover 捕获错误:优雅恢复的真正意义
开发语言·golang
小白学大数据35 分钟前
基于大模型的Python智能爬虫:语义识别与数据清洗实践
开发语言·爬虫·python·数据分析
迷渡1 小时前
聊一聊 Bun 用 Rust 重写这件事
开发语言·后端·rust
古怪今人1 小时前
Gradle构建工具 Groovy/Kotlin DSL的现代化自动化构建工具
开发语言·kotlin·自动化
赏金术士1 小时前
Kotlin 协程与挂起函数(Coroutines & suspend)入门到实战
android·开发语言·kotlin
y = xⁿ1 小时前
Java并发八股学习日记
java·开发语言·学习