指针和数组的一些题目

     在前面的学习中,我们已经对数组以及指针有了进一步的了解了,那么我们来通过一些题巩固巩固吧!

在这里我们再次补充关于数组名的知识:

数组名是数组首元素的地址。

但是有两个例外:

  1. sizeof(数组名) - 数组名代表整个数组,计算的是整个数组的大小,单位是字节
  2. &数组名 - 数组名也代表整个数组,取出的是整个数组的地址

目录

一、一维数组

1.1 整形数组

1.1.1 题目 

 1.1.2 解析

2.1 字符数组

2.1.1 题目一

2.1.2 问题解析

 2.1.3 题目二

 2.1.4 问题解析

2.1.5 题目三

2.1.6 问题解析

三、二维数组

3.1 知识补充

3.2 题目


一、一维数组

1.1 整形数组

1.1.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;
}

上面代码的运行结果是:

 

 1.1.2 解析

2.1 字符数组

2.1.1 题目一

#include<stdio.h>
#include<string.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));
	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));
	return 0;
}

运行结果:

2.1.2 问题解析

 

     strlen是用来求字符串长度的库函数,计算的是字符串中'\0'之前出现的字符个数,统计到'\0'为止,如果没有看到'\0'会继续往后找, 注意,使用strlen库函数时,必须引头文件<string.h>。

     上面的代码虽然有执行结果,显示不出问题,但是我们可以在调试的时候直观的显示出代码存在的问题。

     所以我们在写代码时,需要避免这种代码的产生,认识到这是一种错误代码。 

      这里与上一条代码问题相同,都是错误代码。

 2.1.3 题目二

#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));
	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;
}

 2.1.4 问题解析

有了上面题目的分析,题目二应该很快就能得到答案了吧!

 

 

2.1.5 题目三

#include<stdio.h>
#include<string.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));
	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;
}

2.1.6 问题解析

     接下来是关于strlen的打印:

下面的两句代码都是错误代码:

在编译时我们可以看出错误:

三、二维数组

3.1 知识补充

在下面这个题开始前,我们先来补充一些二维数组相关的知识:

  1. 对于二维数组来说,它的第一行就是它的首元素,数组名除了两种特殊情况外就是首元素的地址,即第一行的地址。
  2. 其次对于二维数组的理解很重要,我们要把类似arr[m][n],m,n都为常量的二维数组看成一个有m个元素的一维数组,每个一维数组有n个元素,即把二维数组的每一行看成一个一维数组,二维数组的首元素就是第一行元素,二维数组的数组名即为第一行元素的地址。

3.2 题目

#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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值