在前面的学习中,我们已经对数组以及指针有了进一步的了解了,那么我们来通过一些题巩固巩固吧!
在这里我们再次补充关于数组名的知识:
数组名是数组首元素的地址。
但是有两个例外:
- sizeof(数组名) - 数组名代表整个数组,计算的是整个数组的大小,单位是字节
- &数组名 - 数组名也代表整个数组,取出的是整个数组的地址
目录
一、一维数组
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 知识补充
在下面这个题开始前,我们先来补充一些二维数组相关的知识:
- 对于二维数组来说,它的第一行就是它的首元素,数组名除了两种特殊情况外就是首元素的地址,即第一行的地址。
- 其次对于二维数组的理解很重要,我们要把类似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;
}