嵌入式C语言面试相关知识——指针和数组的区别

嵌入式C语言面试相关知识------指针和数组的区别

一、博客声明

  又是一年一度的秋招,怎么能只刷笔试题目呢,面试题目也得看,想当好厂的牛马其实也不容易呀O(∩_∩)O。注意:这篇博客大部分是来自网上的资源,通过自问或者他问,然后寻找答案,为了加深印象,总结或者抄一遍。


二、指针和数组的区别

1、基本概念上的区别

  数组: 数组是一组连续的内存位置,储存的是相同类型的数据,数组名就是整个数组的首地址,或者说是第一个元素的地址。数组的大小在声明是就已经决定,后续无法修改。

  指针: 指针是一个变量,储存是某个内存的地址。通过指针可以间接访问或修改该地址处的值。可以动态分配和修改所指向的内存位置。

2、名字上的区别

  数组名: 数组名本质上是一个常量指针,表示的是数组第一个元素的地址,也即数组的起始地址。程序运行的整个过程中都不会发生改变。

  指针名: 指针是一个变量,存储某个内存地址。当一个指针指向数组时,它的初始值是数组的第一个元素地址(即首地址)。但是,指针是可变的,可以通过操作(如++、--等)改变指向的内存地址,这和数组名不同。

3、内存上的区别

  如果你对嵌入式内存相关知识不太了解,可以看看我的这篇博客:内存管理

  数组: 数组储存的位置可以是栈、数据段(bbs段还是.data段取决于是否初始化)、代码段的常量区 ,具体被放在什么位置就要看声明的位置了,并且内存大小在编译时就确定,且是一次性分配,后续无法修改。

c 复制代码
#include <stdio.h>

int arr1[5];						//数据段的BSS段
int arr2[5] = {0};					//数据段的.data段
static int arr3[5];					//数据段的BSS段
static int arr4[5] = {0};			//数据段的.data段
const int arr5[5];					//代码段的常量区,虽然这样定义没啥意义
const int arr6[5] = {0};			//代码段的常量区

int main(){
	int arr7[5];					//栈区
	int arr8[5] = {0};				//栈区
	static int arr9[5];				//数据段的BSS段
	static int arr10[5] = {0};		//数据段的.data段
	const int arr11[5];				//存放在栈区,只读属性
	const int arr12[5] = {0};		//存放在常量区,只读
	return 0;
}

  指针: 指针变量的储存区域与数组一样,根据声明的位置决定。但是指向的内容可以被存放在 中,用malloc进行动态分配。特别注意,下面指针指向的内容放在常量区,无法被修改, 也就是Hello world!这个字符串不能被修改。

c 复制代码
int *arr = (int*)malloc(sizeof(int) * 2);	//arr变量在栈区,但是指向的内容在堆区
char *s = "Hello world!";					//s变量在栈区,但是指向的内容在常量区

4、处理扩展冲突上的区别

  就是一开始声明时没有考虑数据的容量,导致要添加数据后的数据量超过原定的数据量,数组和指针处理这方面的冲突是有区别的。

  数组: 数组处理起来比指针麻烦,因为它的内存大小在编译时就确定,是一次性分配 ,程序运行期间都无法修改的。处理: 一般处理起来就是一开始就将大小预设的大一点;或者写一个函数,运行时检查边界,要满了就重新申请一个更大的数组,将原来的数组内容负责过来,但是原来的数组也没有销毁,就会内存泄漏。

  指针: 指针可以实现动态数组 ,处理起来就很方便了,因为可以使用malloc、calloc动态分配内存,然后realloc来重新分配内存,并且扩展后原来的那片空间会自动释放

c 复制代码
int *arr = (int*)malloc(sizeof(int) * 5);			//一开始只有5个元素
int new_size = 10;									//发现5个元素不够,还要加5元素
arr = (int*)realloc(arr, sizeof(int) * new_size);	//现在数组元素上限扩展到10个元素了

5、sizeof操作符返回的大小区别

  数组: sizeof使用后,返回数组的大小;

c 复制代码
int arr[5] = {0};
printf("%d", sizeof(arr));		//输出5;

  指针: sizeof使用后,32位系统返回4, 64位操作系统返回8;

c 复制代码
int *arr = (int*)malloc(sizeof(int) * 100);
printf("%d", sizeof(arr));		//输出4或8, 取决于系统架构;

6、总结

  数组: 用于存储一组相同类型的值,大小固定,操作简单。

  指针: 用于存储内存地址,灵活,能够动态管理内存,但使用不当可能导致错误。

相关推荐
慧都小项21 分钟前
汽车工具链重复测试太耗人?用 TestComplete 自动跑
功能测试·回归·汽车·嵌入式·软件工程·测试覆盖率
卢锡荣32 分钟前
Type-C口电子产品离不开的C口逻辑专用控制芯片介绍
c语言·开发语言
quarter-moon1 小时前
行研高质量学习资料+面试资料
面试·金融·行研
Discipline~Hai2 小时前
Linux网络编程02-TCP协议
linux·网络·tcp/ip·嵌入式·linux网络编程
Jason_zhao_MR2 小时前
电能质量监测为什么需要PTP精确时钟同步
linux·单片机·嵌入式硬件·嵌入式
布莱克6053 小时前
strcpy 函数详解:作用、用法与安全缺陷
c语言·开发语言·c++·安全
DDXYcoder3 小时前
内存函数与数据存储
c语言
寻求出路的程序媛3 小时前
分布式 & 高性能 & 高可用 体系、学习重点、面试点
分布式·后端·面试·性能优化
Freak嵌入式4 小时前
全网最详细|树莓派 Pico ADC 软件控制全解析:从machine.ADC API 到定时温度采集实战(含 ISR 避坑指南)
嵌入式
课件帮4 小时前
教师考编面试模拟授课课件怎么做?课件帮AI生成教案+PPT+数字人试讲
人工智能·面试·powerpoint