在上一节内容中,我们学习了递归
与冒泡排序法
的有关内容,今天我们将继续往下学习,主要内容为指针练习题
,好了,话不多说,开整!!!
在之前的第18—22的内容中,我们学习了指针
的一系列内容,今天我们对之前的指针内容进行测试,在查看答案之前,请先自己分析,
不要直接复制代码,然后运行得到结果
,因为只有分析了你才知道自己是否是真的掌握了相关内容
,下面开始。
一维数组指针题目
分析以下代码的结果:
#include<stdio.h>
#include<string.h>
int main()
{
int a[] = {1,2,3,4};
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;
}
我们知道sieof是求一个数据的所占用的内存空间的函数
,其单位为字节
。
你分析好了吗,分析好了就可以往下看喽,分析如下:
#include<stdio.h>
#include<string.h>
int main()
{
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a+0)); //数组名默认首元素地址:加0还是首元素地址,地址为一个指针,因此结果为4字节(32位)
printf("%d\n",sizeof(*a));//数组名默认首元素地址,解引用也就是数组中的1,其为整型数据,所以为4字节(32位)
printf("%d\n",sizeof(a+1));//数组名默认首元素地址:加1是数组中第二个元素2的地址,地址4字节
printf("%d\n",sizeof(a[1]));//数组中第一个元素1的大小,其为整型所以为4字节
printf("%d\n",sizeof(&a));//&a:为整个数组的地址,既然为地址,就占4个字节(32位)
printf("%d\n",sizeof(*&a));//对整个数组进行解引用,因此大小为4*4=16字节
printf("%d\n",sizeof(&a+1));//整个数组的下一位元素的大小:4字节
printf("%d\n",sizeof(*&a[0]));//取出第一个元素的地址并解引用,整型数据1,4字节
printf("%d\n",sizeof(*&a[0]+1));//取出第一个元素的地址并解引用,整型数据1,再加1为2,整型2的大小为4字节
return 0;
}
我们编译查看结果,看看是否分析正确呢:
从结果中,我们可以看到我们分析是正确的。
字符数组的指针题目
下面进行分析字符数组
的相关题目,分为sizeof
和strlen
题目两个方面的题目。
sizeof题目
首先我们使用sizeof函数,计算字符数组的大小
,代码如下:
#include<stdio.h>
int main()
{
char a[] = {'a','b','v','c','t'};
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;
}
同样,在分析之后再查看以下的分析过程:
#include<stdio.h>
int main()
{
char a[] = {'a','b','v','c','t'};
printf("%d\n",sizeof(a)); //数组名放入sizeof内,其代表整个数组,每个字符占一个字节,因此,一共5个字节
printf("%d\n",sizeof(a+0));//此时a不再代表整个数组,而是数组首元素的地址,加0 还是首元素地址,地址即为4字节(32位)
printf("%d\n",sizeof(*a));//数组名代表首元素地址,也引用即为字符a,其大小为1字节
printf("%d\n",sizeof(a+1));//数组名代表首元素地址,加1代表字符b的地址,地址即为4字节(32位)
printf("%d\n",sizeof(a[1]));//此时表示数组中字符b的大小,1字节
printf("%d\n",sizeof(&a));//&a代表整个数组的地址,地址即为4字节(32位)
printf("%d\n",sizeof(*&a));//&a代表整个数组的地址,整个数组解引用即5个字节
printf("%d\n",sizeof(&a+1));//&a代表整个数组的地址,加1代表此数组后的下一个元素的地址,地址即为4字节(32位)
printf("%d\n",sizeof(*&a[0]));//取出数组中字符a的地址并解引用,也就是字符a,1字节
printf("%d\n",sizeof(&a[0]+1));//取出数组中字符a的地址,加1表示字符b的地址,地址即为4字节(32位)
return 0;
}
我们查看结果:
和我们分析的结果一致,因此我们的分析是正确的。
strlen题目
strlen是用来求字符串长度的函数,其统计字符串结束标志'\0'前的字符个数,
下面请分析以下代码:
#include<stdio.h>
#include<string.h>
int main()
{
char a[] = {'a','b','v','c','t','r'};
printf("%d\n",strlen(a));
printf("%d\n",strlen(a+0));
printf("%d\n",strlen(*a));
printf("%d\n",strlen(a+1));
printf("%d\n",strlen(a[1]));
printf("%d\n",strlen(&a));
printf("%d\n",strlen(&a+1));
printf("%d\n",strlen(&a[0]+1));
return 0;
}
自己分析完成后,再看以下的分析:
#include<stdio.h>
#include<string.h>
int main()
{
char a[] = {'a','b','v','c','t','r'};
printf("%d\n",strlen(a)); //由于上述这种字符串定义方式并不会自动补充字符串结束标志'\0'
//因此,其将会直至找到\0位置,所以将打印一个随机值
printf("%d\n",strlen(a+0));//数组名默认为书元素地址,加0仍然是首元素地址,然后去找\0,仍是一个随机值
// printf("%d\n",strlen(*a));//对首元素地址解引用,则是字符a,因此将会其对应的ASCII码值的地址开始寻找\0,会产生错误
printf("%d\n",strlen(a+1));//首元素地址加1,则变为了字符数组中字符b的地址,因此将从b开始寻找结束标志\0,也是一个随机值
//但该随机值将等前两个随机值-1
// printf("%d\n",strlen(a[1]));访问数组中的第二个元素,则是字符b,因此将会其对应的ASCII码值的地址开始寻找\0,会产生错误
printf("%d\n",strlen(&a));//&a代表整个数组的地址,从此地址开始找\0,也是一个随机值,和前两个随机值相同
printf("%d\n",strlen(&a+1));//从整个数组后的下一个字节开始寻找\0,随机值,但不等于前几个随机值
printf("%d\n",strlen(&a[0]+1));//&a[0]取出第一个元素的地址,再加1为第二个元素的地址,从此开始寻找\0,其值也为随机值
//数值和前两个随机值再减一相同
return 0;
}
如果我们不注释掉其中的两行,程序将会中断,如下所示:
在Linux
下,我们可以更清楚的看到其发生了错误
,如下:
在注释后,程序正常运行,如下图所示:
发现和我们分析的对上了,因此分析无误。
Ps:
前两天有些事情,因此没有按时更新,以后还是会尽量按时更新,最后
祝大家端午节快乐!!!
上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!