【C语言】指针和数组笔试题解析

文章详细分析了C语言中sizeof运算符和strlen函数在处理一维数组和字符数组时的不同,包括sizeof计算内存占用,strlen计算字符串长度。通过示例代码展示了sizeof对数组名、指针、地址的运算结果,以及strlen对字符串处理的注意事项。
摘要由CSDN通过智能技术生成

简单不先于复杂,而是在复杂之后。

 

 注:题目会附在前面,大家可以先复制代码自己做一遍,再看答案。

目录

1. 一维数组 

2. 字符数组 

2.1 sizeof 相关

2.1.1 题一

2.1.2 题二

2.1.3 题三

2.2 strlen 相关 

2.2.1 题一 

2.2.2 题二

2.2.3 题三 

3. 二维数组 


 

1. 一维数组 

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//一维数组
int main()
{
	int a[] = { 1,2,3,4 };

	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a + 0));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(a[1]));
	printf("%d\n", sizeof(&a));
	printf("%d\n", sizeof(*&a));
	printf("%d\n", sizeof(&a + 1));
	printf("%d\n", sizeof(&a[0]));
	printf("%d\n", sizeof(&a[0] + 1));

	return 0;
}

 

 

 

 

 

 

 

完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//一维数组
int main()
{
	int a[] = { 1,2,3,4 };

	printf("%d\n", sizeof(a));//16
	//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节

	printf("%d\n", sizeof(a + 0));//4(32位平台)/8(64位平台)
	//数组名并不是单独放在 sizeof 内部,也没有取地址,故数组名代表首元素地址,a+0后还是首元素地址
	//是地址,大小就是4/8个字节

	printf("%d\n", sizeof(*a));//4
    //*a 中的 a 就是数组首元素的地址,*a 就是对首元素的地址解引用找到的就是首元素
	//首元素的大小就是4个字节


	printf("%d\n", sizeof(a + 1));//4或者8
	//a 是首元素地址,a + 1 代表第二个元素的地址
	//大小是4/8

	printf("%d\n", sizeof(a[1]));//4
	//计算的是数组第二个元素的大小

	printf("%d\n", sizeof(&a));//4/8
    //&a 取出的是数组的地址,数组的地址,也就是个地址
	//是地址,大小就是4/8

	printf("%d\n", sizeof(*&a));//16
	//&a 得到的是数组的地址,类型是int(*)[4],是一种数组指针
	//数组指针解引用找到的是数组
	
	//也可以理解为 & 和 * 抵消 

	printf("%d\n", sizeof(&a + 1));//4/8
	//&a 取出的是数组的地址,=
	//&a 类型是 int(*)[4]
	//&a+1 是从数组a的地址向后跳过一个了(4个整型元素的)数组的大小
	//&a+1还是地址,是地址就是4/8个字节

	printf("%d\n", sizeof(&a[0]));//4/8
	//&a[0]取出的是第一个元素的地址
	//计算的就是地址的大小

	printf("%d\n", sizeof(&a[0] + 1));//4/8
	//&a[0]+1 是第二个元素的地址
	//大小是4/8个字节

	return 0;
}

2. 字符数组 

strlen: 求字符串长度的,关注的是字符串中的 \0 ,计算的是 \0 之前出现的字符字数

            是库函数,只针对字符串

 

sizeof:只关注占用内存空间的大小,不在乎内存中放的是什么

              是操作符

2.1 sizeof 相关

2.1.1 题一

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

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]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));

	return 0;
}

 

 

 

 

 

 

完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	//字符数组
	char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", sizeof(arr));//6
	//sizeof(数组名)计算整个数组的大小

	printf("%d\n", sizeof(arr + 0));//4/8
	//arr + 0 是数组首元素的地址

	printf("%d\n", sizeof(*arr));//1
	//*arr 就是数组的首元素,大小是1字节
	//*arr -->  arr[0
    //*(arr + 0) --> arr[0]
	 
	printf("%d\n", sizeof(arr[1]));//1
	printf("%d\n", sizeof(&arr));//4/8
	//&arr 是数组的地址,是地址就是4/8个字节

	printf("%d\n", sizeof(&arr + 1));//4/8
	//&arr + 1 是数组后的地址

	printf("%d\n", sizeof(&arr[0] + 1));//4/8
	//&arr[0] + 1 是第二个元素的地址

	return 0;
}

2.1.2 题二

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	char arr[] = "abcdef";

	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));

	return 0;
}

 

2.1.3 题三

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	char* p = "abcdef";

	printf("%d\n", sizeof(p));
	printf("%d\n", sizeof(p + 1));
	printf("%d\n", sizeof(*p));
	printf("%d\n", sizeof(p[0]));
	printf("%d\n", sizeof(&p));
	printf("%d\n", sizeof(&p + 1));
	printf("%d\n", sizeof(&p[0] + 1));

	return 0;
}

 

 

2.2 strlen 相关 

2.2.1 题一 

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));
	
	return 0;
}

 

 

完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

int main()
{
	char arr[] = { 'a','b','c','d','e','f' };

	printf("%d\n", strlen(arr));//随机值
	// strlen 会从数组首地址直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')

	printf("%d\n", strlen(arr + 0));//随机值(同理)

	printf("%d\n", strlen(*arr));//--> strlen('a'); --> strlen(97); //野指针
	//程序会报错
	printf("%d\n", strlen(arr[1]));//--> strlen('b'); --> strlen(98); //野指针

	printf("%d\n", strlen(&arr));//随机值

	printf("%d\n", strlen(&arr + 1));//随机值 - 6

	printf("%d\n", strlen(&arr[0] + 1));//随机值 - 1
	
	return 0;
}

 2.2.2 题二

 

 

 

2.2.3 题三 

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

int main()
{
	char* p = "abcdef";

	printf("%d\n", strlen(p));

	printf("%d\n", strlen(p + 1));

	printf("%d\n", strlen(*p));
	printf("%d\n", strlen(p[0]));

	printf("%d\n", strlen(&p));

	printf("%d\n", strlen(&p + 1));

	printf("%d\n", strlen(&p[0] + 1));
	
	return 0;
}

 

3. 二维数组 

 

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
	int a[3][4] = { 0 };

	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a[0][0]));
	printf("%d\n", sizeof(a[0]));
	printf("%d\n", sizeof(a[0] + 1));
	printf("%d\n", sizeof(*(a[0] + 1)));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(*(a + 1)));
	printf("%d\n", sizeof(&a[0] + 1));
	printf("%d\n", sizeof(*(&a[0] + 1)));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a[3]));

	return 0;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2024_极限年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值