当前位置: 首页 > news >正文

【C语言——练习题】指针,你真的学会了吗?

✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦!!✨✨✨✨

文章目录

    • ✨✨✨✨如果文章对你有帮助记得点赞收藏关注哦!!✨✨✨✨
  • 一维数组练习题:
  • 字符数组练习题:
  • 字符指针练习题:
  • 二维数组练习题:
  • 编程题:
    • 完结


你真的学会指针了吗?几组练习题,能全答对超99%初学者,务必思考后再看答案🧐:

做题之前必须明白以下规则

提示:

1.数组名一般情况下都是代表首地址,不过有两种特殊情况

(1)数组名单独出现在sizeof内部

(2)&数组名

2.指针在32位平台下的大小是4个字节,在64位平台下是8个字节。(下面答案内的4/8就是值32位平台和64位平台分别为4/8

3.sizeof不关心内部是什么值,只关心返回结果的类型,比如

#include <stdio.h>
int main()
{int a = 0;int b = 0;printf("%d",sizeof(b=a+1));	//4printf("%d",b);				//0 可以看到b并没有被赋值,因为sizeof不关心内部运算只在意返回类型,整形a+整形1赋值给整形b结果肯定为整形,直接就返回4
}

一维数组练习题:


//一维数组
#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));
}

答案

在这里插入图片描述

字符数组练习题:

//字符数组
#inlcude <stdio.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));  printf("%d\n", strlen(&arr+1));printf("%d\n", strlen(&arr[0]+1));
}

答案

在这里插入图片描述

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

答案在这里插入图片描述

字符指针练习题:

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

答案

在这里插入图片描述

二维数组练习题:

提示

在这里插入图片描述

//二维数组
#inlcude <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]));  
}

答案

在这里插入图片描述

编程题:

问:下列程序输出什么?

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

答案:

2,5

a为首元素地址,+1为第二个元素的地址,解引用就是2

&a+1加步长为整个数组,强转成int*赋值给ptr,ptr-1步长就是int *为四个字节,就是5的地址,解引用就是5

在这里插入图片描述

//由于还没学习结构体,这里告知结构体的大小是20个字节
#inlcude <stdio.h>
struct Test
{	int Num;char *pcName;short sDate;char cha[2];short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}

答案:

2,5在这里插入图片描述

#inlcude <stdio.h>
int main()
{int a[4] = { 1, 2, 3, 4 };int *ptr1 = (int *)(&a + 1);int *ptr2 = (int *)((int)a + 1);printf( "%x,%x", ptr1[-1], *ptr2);return 0;
}

答案:

在这里插入图片描述

在这里插入图片描述

什么是小端存储?链接: 大小端字节序讲解。

#include <stdio.h>
int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };int *p;p = a[0];printf( "%d", p[0]);return 0;
}

答案:

在这里插入图片描述

#inlcude <stdio.h>
int main()
{int a[5][5];int(*p)[4];p = a;printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);return 0;
}

答案:

在这里插入图片描述

在这里插入图片描述

#inlcude <stdio.h>
int main()
{int aa[2][5] = { 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;
}

答案:

在这里插入图片描述

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

答案:

在这里插入图片描述

在这里插入图片描述

#inlcude <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]+1);return 0;
}

答案:

在这里插入图片描述

(1) POINT

在这里插入图片描述

(2) ER

在这里插入图片描述

(3) ST

在这里插入图片描述

(4)EW

在这里插入图片描述


完结

创作不易,还请各位小伙伴多多点赞👍关注✨收藏⭐

请添加图片描述

http://www.lryc.cn/news/28918.html

相关文章:

  • Linux用户空间与内核空间通信(Netlink通信机制)
  • 3.3日报
  • 并发编程-进程
  • LeetCode196_196. 删除重复的电子邮箱
  • Auto.js Pro 替代品
  • 红日(vulnstack)2 内网渗透ATTCK实战
  • 一个好的工程项目管理软件所包含的主要功能
  • 【大数据监控】Grafana、Spark、HDFS、YARN、Hbase指标性能监控安装部署详细文档
  • 面试题---CSS
  • 【C++】vector
  • RocketMQ安装
  • Spring——什么是IOC?
  • 力扣(LeetCode)430. 扁平化多级双向链表(2023.03.04)
  • 条款13:优先考虑const_iterator而非iterator
  • 23考研 长安大学846计算机考研复试《数据库》
  • Android 9.0 系统去掉省电模式
  • 3 mmmmm
  • nvidia Jetson nano Linux内核编译
  • 理想汽车2023年销量冲击30万辆有戏吗?
  • 借助CatGPT让turtlesim小乌龟画曲线
  • Java面试总结(四)
  • 强强联合,再强的英伟达NVIDIA也不落俗套
  • maven使用心得
  • 【算法题】1958. 检查操作是否合法
  • 十一、GoF之代理模式
  • MySQL5.6和JVM(1.6)调优
  • 【汇编】三、寄存器(一只 Assember 的成长史)
  • TFT通信协议解析与应用
  • python 操作word库docx 增强接口
  • ARM uboot 源码分析9 - uboot的硬件驱动部分