【C语言】数组与指针常见笔试题讲解(1)

0. 前言

小伙伴们大家好!通过之前的学习,相信大家对数组,指针有了基本的认识,数组和指针在C语言中是非常重要的概念,也是未来找工作笔试中经常出现的考点。本文将对一些常见的数组与指针相关的笔试题进行详细解析,帮助您更好地理解和掌握这部分知识。

1. 数组试题

1.1 整型数组:

题目如下:

大家不妨先思考一下这些题,看看它们的输出结果是什么?

int main()
{
	int a[] = { 1,2,3,4 };		
	printf("%zd\n", sizeof(a));
	printf("%zd\n", sizeof(a + 0));		
	printf("%zd\n", sizeof(*a));
	printf("%zd\n", sizeof(a + 1));		
	printf("%zd\n", sizeof(a[1]));
	printf("%zd\n", sizeof(&a));			
	printf("%zd\n", sizeof(*&a));		
	printf("%zd\n", sizeof(&a + 1));
	printf("%zd\n", sizeof(&a[0]));
	printf("%zd\n", sizeof(&a[0] + 1));			                
	return 0;
}

🌟🌟知识回顾:

在学习操作符的时候,我们学习过 sizeof,sizeof 计算的是变量所占内存内存空间⼤⼩的,单位是字节,如果操作数是类型的话 sizeof(类型),计算的是使⽤类型创建的变量所占内存空间的⼤⼩

我们要注意的是:sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。

另外,在数组章节讲过的易错点,就是对于 “数组名” 的理解

数组名一般是数组首元素(第一个元素)的地址,但是有两个例外,

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

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

除此之外,所以的数组名是数组首元素(第一个元素)的地址。

我们来分析一下:

int main()
{
	int a[] = { 1,2,3,4 };//数组a有4个元素:1,2,3,4

	printf("%zd\n", sizeof(a));//16 -- sizeof括号内单独放数组名a, 
    数组名表示整个数组,计算的是整个数组的大小, 4个元素,每个元素都是整型,
    整型占4个字节,4*4=16字节
	
    printf("%zd\n", sizeof(a + 0));//a是首元素的地址-类型是int*, 
    a+0 还是首元素的地址,是地址大小就是4/8
	
    printf("%zd\n", sizeof(*a));//a是首元素的地址,*a就是首元素,大小就是4个字节
	其实可以理解为:*a == a[0] == *(a+0)
	
    printf("%zd\n", sizeof(a + 1));//a是首元素的地址,
    类型是int*,a+1跳过1个整型,a+1就是第二个元素的地址,4/8
	
    printf("%zd\n", sizeof(a[1]));//a[1]就是第二个元素,大小4个字节
	printf("%zd\n", sizeof(&a));//&a是数组的地址,数组的地址也是地址,
    是地址大小就是4/8个字节
	
    printf("%zd\n", sizeof(*&a));
    //1. *& 互相抵消了,sizeof(*&a) = sizeof(a) -16
	//2. &a 是数组的地址,类型是int(*)[4],对数组指针解引用访问的是数组, 
    计算的是数组的大小 -16
	
    printf("%zd\n", sizeof(&a + 1));//&a+1是跳过整个数组后的那个位置的地址,
    是地址就是4/8个字节
	printf("%zd\n", sizeof(&a[0])); //首元素的地址,大小4/8个字节
	printf("%zd\n", sizeof(&a[0] + 1));//&a[0] + 1 -- 数组第二个元素的地址,
    大小是4/8个字节

	return 0;
}

那我们分析的是否正确呢,接下来我们分别用vs的x64环境和x86环境来测试一下运行结果~

在X64环境下,是64位,所以地址大小为8 

我们再看这个,在X86环境,是32位,所以地址大小为4,这也就是为什么指针大小是4或者8的原因 

1.2 字符数组

代码1:

现在我们把整型数组换成字符数组了,大家思考下面程序会输出什么结果? 

待会我们会统一讲解一下。

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	pr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值