首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >指针强化练习(详解)

指针强化练习(详解)

作者头像
敲上瘾
发布2025-11-15 08:57:10
发布2025-11-15 08:57:10
690
举报

更多学习内容 [结构体内存对齐 和 位段-CSDN博客](https://blog.csdn.net/2302_80105876/article/details/136970251)[指针初级(基础知识)-CSDN博客](https://blog.csdn.net/2302_80105876/article/details/136568130)[指针进阶(深入理解)-CSDN博客](https://blog.csdn.net/2302_80105876/article/details/136983013)

1.sizeof与strlen的区别

请思考以下运行结果

代码语言:txt
复制
    #include <stdio.h>
代码语言:txt
复制
     int main()
代码语言:txt
复制
     {
代码语言:txt
复制
             char arr1[3] = {'a', 'b', 'c'};
代码语言:txt
复制
             char arr2[] = "abc";
代码语言:txt
复制
             printf("%d\n", strlen(arr1));
代码语言:txt
复制
             printf("%d\n", strlen(arr2));
代码语言:txt
复制
             printf("%d\n", sizeof(arr1));
代码语言:txt
复制
             printf("%d\n", sizeof(arr1));
代码语言:txt
复制
             return 0;
代码语言:txt
复制
     }

结果为: 随机值,3,3,4

2.一维数组

请思考以下运行结果

代码语言:txt
复制
    int a[] = {1,2,3,4};
代码语言:txt
复制
     printf("%d\n",sizeof(a));
代码语言:txt
复制
     printf("%d\n",sizeof(a+0));
代码语言:txt
复制
     printf("%d\n",sizeof(\*a));
代码语言:txt
复制
     printf("%d\n",sizeof(a+1));
代码语言:txt
复制
     printf("%d\n",sizeof(a[1]));
代码语言:txt
复制
     printf("%d\n",sizeof(&a));
代码语言:txt
复制
     printf("%d\n",sizeof(\*&a));
代码语言:txt
复制
     printf("%d\n",sizeof(&a+1));
代码语言:txt
复制
     printf("%d\n",sizeof(&a[0]));
代码语言:txt
复制
     printf("%d\n",sizeof(&a[0]+1));

结果为164或844或844或8164或84或84或8

3.字符指针

请思考以下运行结果

代码1

代码语言:txt
复制
    char arr[] = {'a','b','c','d','e','f'};
代码语言:txt
复制
     printf("%d\n", sizeof(arr));
代码语言:txt
复制
     printf("%d\n", sizeof(arr+0));
代码语言:txt
复制
     printf("%d\n", sizeof(\*arr));
代码语言:txt
复制
     printf("%d\n", sizeof(arr[1]));
代码语言:txt
复制
     printf("%d\n", sizeof(&arr));
代码语言:txt
复制
     printf("%d\n", sizeof(&arr+1));
代码语言:txt
复制
     printf("%d\n", sizeof(&arr[0]+1));

结果为6,1,1,4/8,4/8,4/8

代码2

代码语言:txt
复制
    char arr[] = {'a','b','c','d','e','f'};
代码语言:txt
复制
     printf("%d\n", strlen(arr));
代码语言:txt
复制
     printf("%d\n", strlen(arr+0));
代码语言:txt
复制
     printf("%d\n", strlen(\*arr));
代码语言:txt
复制
     printf("%d\n", strlen(arr[1]));
代码语言:txt
复制
     printf("%d\n", strlen(&arr));
代码语言:txt
复制
     printf("%d\n", strlen(&arr+1));
代码语言:txt
复制
     printf("%d\n", strlen(&arr[0]+1));

结果为随机值n,随机值n,?,?,随机值n,随机值n-6,随机值n-1

代码3

代码语言:txt
复制
    char arr[] = "abcdef";
代码语言:txt
复制
     printf("%d\n", sizeof(arr));
代码语言:txt
复制
     printf("%d\n", sizeof(arr+0));
代码语言:txt
复制
     printf("%d\n", sizeof(\*arr));
代码语言:txt
复制
     printf("%d\n", sizeof(arr[1]));
代码语言:txt
复制
     printf("%d\n", sizeof(&arr));
代码语言:txt
复制
     printf("%d\n", sizeof(&arr+1));
代码语言:txt
复制
     printf("%d\n", sizeof(&arr[0]+1));

结果为7,4/8,1,1,4/8,4/8,4/8

代码4

代码语言:txt
复制
    char arr[] = "abcdef";
代码语言:txt
复制
     printf("%d\n", strlen(arr));
代码语言:txt
复制
     printf("%d\n", strlen(arr+0));
代码语言:txt
复制
     printf("%d\n", strlen(\*arr));
代码语言:txt
复制
     printf("%d\n", strlen(arr[1]));
代码语言:txt
复制
     printf("%d\n", strlen(&arr));
代码语言:txt
复制
     printf("%d\n", strlen(&arr+1));
代码语言:txt
复制
     printf("%d\n", strlen(&arr[0]+1));

结果为6,6,?,?,6,随机值,5

代码5

代码语言:txt
复制
    char \*p = "abcdef";
代码语言:txt
复制
     printf("%d\n", sizeof(p));
代码语言:txt
复制
     printf("%d\n", sizeof(p+1));
代码语言:txt
复制
     printf("%d\n", sizeof(\*p));
代码语言:txt
复制
     printf("%d\n", sizeof(p[0]));
代码语言:txt
复制
     printf("%d\n", sizeof(&p));
代码语言:txt
复制
     printf("%d\n", sizeof(&p+1));
代码语言:txt
复制
     printf("%d\n", sizeof(&p[0]+1));

结果为4/8,4/8,1,1,4/8,4/8,4/8

代码6

代码语言:txt
复制
    char \*p = "abcdef";
代码语言:txt
复制
     printf("%d\n", strlen(p));
代码语言:txt
复制
     printf("%d\n", strlen(p+1));
代码语言:txt
复制
     printf("%d\n", strlen(\*p));
代码语言:txt
复制
     printf("%d\n", strlen(p[0]));
代码语言:txt
复制
     printf("%d\n", strlen(&p));
代码语言:txt
复制
     printf("%d\n", strlen(&p+1));
代码语言:txt
复制
     printf("%d\n", strlen(&p[0]+1));

结果为6,5,?,?,6?,随机值,5

4.二维数组

请思考以下运行结果

代码语言:txt
复制
    int a[3][4] = {0};
代码语言:txt
复制
     printf("%d\n",sizeof(a));
代码语言:txt
复制
     printf("%d\n",sizeof(a[0][0]));
代码语言:txt
复制
     printf("%d\n",sizeof(a[0]));
代码语言:txt
复制
     printf("%d\n",sizeof(a[0]+1));
代码语言:txt
复制
     printf("%d\n",sizeof(\*(a[0]+1)));
代码语言:txt
复制
     printf("%d\n",sizeof(a+1));
代码语言:txt
复制
     printf("%d\n",sizeof(\*(a+1)));
代码语言:txt
复制
     printf("%d\n",sizeof(&a[0]+1));
代码语言:txt
复制
     printf("%d\n",sizeof(\*(&a[0]+1)));
代码语言:txt
复制
     printf("%d\n",sizeof(\*a));
代码语言:txt
复制
     printf("%d\n",sizeof(a[3]));

结果为48,4,16,4/8,4,4/8,16,4/8,16,16,16

5.指针运算(笔试题)

请思考以下运行结果

试题1 #include <stdio.h> int main() { int a5 = { 1, 2, 3, 4, 5 }; int *ptr = (int *)(&a + 1); printf( "%d,%d", *(a + 1), *(ptr - 1)); return 0; }

结果为2,5

试题2 struct Test { int Num; char *pcName; short sDate; char cha2; short sBa4; }*p = (struct Test*)0x100000; int main() { printf("%p\n", p + 0x1); printf("%p\n", (unsigned long)p + 0x1); printf("%p\n", (unsigned int*)p + 0x1); return 0; }

结果为00100020,00100001,00100004(32位机器)

以上结构体内存布局如下:

这里涉及到结构体内存对齐的知识,不理解可以点击链接学习

试题3 #include <stdio.h> int main() { int a3 = { (0, 1), (2, 3), (4, 5) }; int *p; p = a0; printf( "%d", p0); return 0; }

结果为1

试题4 #include <stdio.h> int main() { int a5; int(*p)4; p = a; printf( "%p,%d\n", &p4 - &a4, &p4 - &a4); return 0; }

结果为FFFFFFFC ,4

注意:二维数组在物理内存上储存其实是连续的

内存布局为:

注意:指针减指针得到的是指针之间的元素个数,而不是地址的差值

试题5 #include <stdio.h> int main() { int aa2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int *ptr1 = (int *)(&aa + 1); int *ptr2 = (int *)(*(aa + 1)); printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1)); return 0; }

结果为10,5

试题6 #include <stdio.h> int main() { char *a[] = {"work","at","alibaba"}; char**pa = a; pa++; printf("%s\n", *pa); return 0; }

结果为at

试题7 #include <stdio.h> int main() { char *c[] = {"ENTER","NEW","POINT","FIRST"}; char**cp[] = {c+3,c+2,c+1,c}; char***cpp = cp; printf("%s\n", **++cpp); printf("%s\n", *--*++cpp+3); printf("%s\n", *cpp-2+3); printf("%s\n", cpp-1+1); return 0; }

结果为POINT ER ST EW

做这样的题一定要学会画图,画出图结果就一幕了然了,如下:

注:看题解的时候要看图理解

6.函数指针

请解释以下代码:

这段代码表示把0强制类型转化为void(*)()这样的函数再进行解引用进行调用

这段代码出⾃:《C陷阱和缺陷》这本书以下图片为书中所取

请解释以下代码:

这是表示一个函数名为signal参数类型为int和void()(int**),返回类型为void(*)(int)的函数指针。**

指针练习就到此结束,感谢阅读

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.sizeof与strlen的区别
  • 2.一维数组
  • 3.字符指针
  • 4.二维数组
  • 5.指针运算(笔试题)
  • 6.函数指针
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档