C语言学习(二十五)---指针练习题(一)

在上一节内容中,我们学习了递归冒泡排序法的有关内容,今天我们将继续往下学习,主要内容为指针练习题,好了,话不多说,开整!!!

在之前的第18—22的内容中,我们学习了指针的一系列内容,今天我们对之前的指针内容进行测试,在查看答案之前,请先自己分析,

不要直接复制代码,然后运行得到结果

因为只有分析了你才知道自己是否是真的掌握了相关内容,下面开始。

一维数组指针题目

分析以下代码的结果:

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

我们编译查看结果,看看是否分析正确呢

C语言学习(二十五)---指针练习题(一)_第1张图片
从结果中,我们可以看到我们分析是正确的。

字符数组的指针题目

下面进行分析字符数组的相关题目,分为sizeofstrlen题目两个方面的题目。

sizeof题目

首先我们使用sizeof函数,计算字符数组的大小,代码如下:

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

我们查看结果:
C语言学习(二十五)---指针练习题(一)_第2张图片
和我们分析的结果一致,因此我们的分析是正确的。

strlen题目

strlen是用来求字符串长度的函数,其统计字符串结束标志'\0'前的字符个数,下面请分析以下代码:

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

如果我们不注释掉其中的两行程序将会中断,如下所示:
C语言学习(二十五)---指针练习题(一)_第3张图片
Linux下,我们可以更清楚的看到其发生了错误,如下:
C语言学习(二十五)---指针练习题(一)_第4张图片

注释后,程序正常运行,如下图所示:
C语言学习(二十五)---指针练习题(一)_第5张图片
发现和我们分析的对上了,因此分析无误。
Ps:
前两天有些事情,因此没有按时更新,以后还是会尽量按时更新,最后

祝大家端午节快乐!!!

上述内容即使今天的全部内容了,感谢大家的观看。
如果方便,辛苦大家点个赞和关注哦!
您的点赞或评论或关注是对我最大的肯定,谢谢大家!!!

你可能感兴趣的:(C语言学习,c语言,学习,开发语言)