单片机C语言指针学习资料

版权申诉
0 下载量 177 浏览量 更新于2024-10-26 收藏 174KB ZIP 举报
资源摘要信息:"c_pointer.zip_指针" 标题中的知识点:"指针" 指针是C语言中一个非常重要的概念,它提供了一种通过引用而不是复制值来操作数据的方式。在C语言中,指针是一种变量,它的值为内存地址,这个地址是另一个变量的存储位置。通过指针,我们可以直接访问内存中的数据,实现数据的动态分配、内存的直接管理以及高效的数组和字符串操作。 1. 指针的基本概念 - 指针的声明:如何声明一个指针变量,例如int *ptr; - 指针的初始化:如何将一个指针初始化为一个有效的内存地址。 - 指针的使用:如何通过指针访问其所指向的内存位置的数据。 2. 指针与数组 - 指针与数组的关系:数组名作为指针的概念。 - 指针遍历数组:利用指针遍历数组元素的技巧。 - 指针与多维数组:如何使用指针访问多维数组的元素。 3. 指针与函数 - 函数参数的传递方式:通过值传递与通过指针传递的区别。 - 返回指针的函数:如何设计返回指针的函数来操作数据。 - 指针与字符串:C语言中字符串是字符数组,如何通过指针操作字符串。 4. 指针与动态内存分配 - malloc和calloc函数:动态分配内存的两种主要方式。 - realloc函数:调整已分配内存大小的方法。 - free函数:释放动态分配内存的重要性。 5. 指针的高级用法 - 指针与结构体:如何通过指针操作结构体变量。 - 指针与const关键字:理解const修饰的指针和指向const的指针的区别。 - 指针运算:指针的算术运算和关系运算。 描述中的知识点:"单片机C语言指针学习资料" 单片机编程经常使用C语言,而在单片机环境下,指针的使用尤为重要,因为单片机的内存资源有限,通过指针可以更加高效地利用内存资源,访问特定的内存地址,进行寄存器级别的操作,这对于硬件的控制与访问尤为关键。 1. 单片机内存映射 - 理解单片机的内存映射以及特殊功能寄存器(SFR)的访问。 - 学习如何使用指针访问不同的内存区域和特殊功能寄存器。 2. 指针与硬件接口 - 指针在硬件操作中的应用,如直接通过指针操作I/O端口。 - 单片机中断服务程序中指针的使用和注意事项。 3. 指针与定时器/计数器 - 如何使用指针控制和读取定时器/计数器的值。 4. 指针与串行通信 - 利用指针操作串行端口,进行数据的收发。 5. 实例分析 - 单片机项目中的指针应用实例分析,如LED控制、按键检测等。 标签中的知识点:"指针" 标签直接指向了这个压缩包资源的核心主题,即指针。它提示我们压缩包中包含的资源将围绕着指针这一主题展开,包括但不限于单片机编程中的指针应用,以及C语言在一般编程中关于指针的使用。 文件列表中的知识点:"c_pointer.PPT" PPT文件通常包含了结构化的演示内容,所以"c_pointer.PPT"很可能是按照一定的逻辑顺序来介绍指针的各个方面,它可能包含了一系列幻灯片,每个幻灯片讲解指针的一个或者几个方面,如指针基础、指针进阶、指针在单片机编程中的应用等。 文件列表中的知识点:"***.txt" 该文本文件可能是一个阅读资料的链接或者是从在线资源站点***获取的文本形式的学习材料。***是一个常用来分享编程相关文档的平台。这个文件可能包含的是指针相关编程实例、问题解答、学习笔记等,或者是提供进一步学习指针的扩展资源链接。 总结来说,这份压缩包资源主要围绕指针这一核心概念展开,从基础到高级应用,特别强调了单片机环境下C语言指针的使用,对于初学者来说是一个非常好的学习资料,可以帮助他们从零开始理解指针,并最终能够将指针应用于实际的编程任务中,特别是在资源受限的单片机编程场景下。

下段代码 可以拖动,但缩放和旋转时会闪退,请改正 public boolean onTouchEvent(MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: // 手指压下屏幕 mode = MODE.DRAG; // 查找被点击的图片 int index = event.getActionIndex(); float x = event.getX(index); float y = event.getY(index); CustomBitmap clickedBitmap = findClickedBitmap(x, y); if (clickedBitmap != null) { // 切换操作对象 _bitmaps.remove(clickedBitmap); _bitmaps.add(clickedBitmap); // 记录ImageView当前的移动位置 currentMatrix.set(clickedBitmap.matrix); clickedBitmap.matrix.set(currentMatrix); clickedBitmap.startPoint.set(x, y); _curCustomBitmap = clickedBitmap; } postInvalidate(); break; case MotionEvent.ACTION_POINTER_DOWN: // 当屏幕上还有触点(手指),再有一个手指压下屏幕 mode = MODE.ZOOM; // 记录位图的旋转角度和缩放倍数 _curCustomBitmap.oldRotation = rotation(event); _curCustomBitmap.startDis = distance(event); if (_curCustomBitmap.startDis > 10f) { // 获取缩放中心点的坐标 float x1 = event.getX(0); float y1 = event.getY(0); float x2 = event.getX(1); float y2 = event.getY(1); _curCustomBitmap.midPoint.set((x1 + x2) / 2, (y1 + y2) / 2); // 记录ImageView当前的缩放倍数 currentMatrix.set(_curCustomBitmap.matrix); } break; case MotionEvent.ACTION_MOVE: // 手指在屏幕移动,该事件会不断地触发 if (mode == MODE.DRAG) { // 移动图片 float dx = event.getX() - _curCustomBitmap.startPoint.x; float dy = event.getY() - _curCustomBitmap.startPoint.y; _curCustomBitmap.matrix.set(currentMatrix); _curCustomBitmap.matrix.postTranslate(dx, dy); } else if (mode == MODE.ZOOM) { // 缩放和旋转图片 float endDis = distance(event); float rotation = rotation(event) - _curCustomBitmap.oldRotation; if (endDis > 10f) { float scale = endDis / _curCustomBitmap.startDis; _curCustomBitmap.matrix.set(currentMatrix); _curCustomBitmap.matrix.postScale(scale, scale, _curCustomBitmap.midPoint.x, _curCustomBitmap.midPoint.y); _curCustomBitmap.matrix.postRotate(rotation, _curCustomBitmap.midPoint.x, _curCustomBitmap.midPoint.y); } } break; case MotionEvent.ACTION_POINTER_UP: // 有手指离开屏幕,但屏幕还有触点(手指) mode = MODE.NONE; break; } invalidate(); return true;

2023-06-06 上传

请优化代码,以下代码无法释放焦点 ,不能变换拖动目标 public boolean onTouchEvent(MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: // 手指压下屏幕 mode = MODE.DRAG; // 寻找被点击的图片 CustomBitmap clickedBitmap = null; for (CustomBitmap bitmap : _bitmaps) { float[] values = new float[9]; bitmap.matrix.getValues(values); float globalX = values[Matrix.MTRANS_X]; float globalY = values[Matrix.MTRANS_Y]; float width = values[Matrix.MSCALE_X] * bitmap.getBitmap().getWidth(); float height = values[Matrix.MSCALE_Y] * bitmap.getBitmap().getWidth(); Rect rect = new Rect((int) globalX, (int) globalY, (int) (globalX + width), (int) (globalY + height)); if (rect.contains((int) event.getX(), (int) event.getY())) { clickedBitmap = bitmap; break; } } // 切换操作对象 if (clickedBitmap != null) { _bitmaps.remove(clickedBitmap); _bitmaps.add(clickedBitmap); currentMatrix.set(clickedBitmap.matrix);// 记录ImageView当前的移动位置 clickedBitmap.matrix.set(currentMatrix); clickedBitmap.startPoint.set(event.getX(), event.getY()); _curCustomBitmap = clickedBitmap; } postInvalidate(); break; case MotionEvent.ACTION_POINTER_DOWN: // 当屏幕上还有触点(手指),再有一个手指压下屏幕 mode = MODE.ZOOM; _curCustomBitmap.oldRotation = rotation(event); _curCustomBitmap.startDis = distance(event); if (_curCustomBitmap.startDis > 10f) { _curCustomBitmap.midPoint = mid(event); currentMatrix.set(_curCustomBitmap.matrix);// 记录ImageView当前的缩放倍数 } break; case MotionEvent.ACTION_MOVE: // 手指在屏幕移动,该事件会不断地触发 if (mode == MODE.DRAG) { float dx = event.getX() - _curCustomBitmap.startPoint.x;// 得到在x轴的移动距离 float dy = event.getY() - _curCustomBitmap.startPoint.y;// 得到在y轴的移动距离 _curCustomBitmap.matrix.set(currentMatrix);// 在没有进行移动之前的位置基础上进行移动 _curCustomBitmap.matrix.postTranslate(dx, dy); } else if (mode == MODE.ZOOM) {// 缩放与旋转 float endDis = distance(event);// 结束距离 _curCustomBitmap.rotation = rotation(event) - _curCustomBitmap.oldRotation; if (endDis > 10f) { float scale = endDis / _curCustomBitmap.startDis;// 得到缩放倍数 _curCustomBitmap.matrix.set(currentMatrix); _curCustomBitmap.matrix.postScale(scale, scale, _curCustomBitmap.midPoint.x, _curCustomBitmap.midPoint.y); _curCustomBitmap.matrix.postRotate(_curCustomBitmap.rotation, _curCustomBitmap.midPoint.x, _curCustomBitmap.midPoint.y); } } break; case MotionEvent.ACTION_UP: // 手指离开屏 break; case MotionEvent.ACTION_POINTER_UP: // 有手指离开屏幕,但屏幕还有触点(手指) mode = MODE.NONE; break; } invalidate(); return true; }

2023-06-06 上传

以下代码 ,拖动功能正常,但是在用两根手指进行缩放和旋转时闪退,请您完善 。public boolean onTouchEvent(MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: // 手指压下屏幕 mode = MODE.DRAG; // 查找被点击的图片 int index = event.getActionIndex(); float x = event.getX(index); float y = event.getY(index); CustomBitmap clickedBitmap = findClickedBitmap(x, y); if (clickedBitmap != null) { // 切换操作对象 _bitmaps.remove(clickedBitmap); _bitmaps.add(clickedBitmap); // 记录ImageView当前的移动位置 currentMatrix.set(clickedBitmap.matrix); clickedBitmap.matrix.set(currentMatrix); clickedBitmap.startPoint.set(x, y); _curCustomBitmap = clickedBitmap; } postInvalidate(); break; case MotionEvent.ACTION_POINTER_DOWN: // 当屏幕上还有触点(手指),再有一个手指压下屏幕 mode = MODE.ZOOM; // 记录位图的旋转角度和缩放倍数 if (_curCustomBitmap == null) { return true; } _curCustomBitmap.oldRotation = rotation(event); _curCustomBitmap.startDis = distance(event); if (_curCustomBitmap.startDis > 10f) { // 获取缩放中心点的坐标 float x1 = event.getX(0); float y1 = event.getY(0); float x2 = event.getX(1); float y2 = event.getY(1); _curCustomBitmap.midPoint.set((x1 + x2) / 2, (y1 + y2) / 2); // 记录ImageView当前的缩放倍数 currentMatrix.set(_curCustomBitmap.matrix); } break; case MotionEvent.ACTION_MOVE: // 手指在屏幕移动,该事件会不断地触发 if (mode == MODE.DRAG) { // 移动图片 if (_curCustomBitmap == null) { return true; } float dx = event.getX() - _curCustomBitmap.startPoint.x; float dy = event.getY() - _curCustomBitmap.startPoint.y; _curCustomBitmap.matrix.set(currentMatrix); _curCustomBitmap.matrix.postTranslate(dx, dy); } else if (mode == MODE.ZOOM) { // 缩放和旋转图片 if (_curCustomBitmap == null) { return true; } float endDis = distance(event); float rotation = rotation(event) - _curCustomBitmap.oldRotation; if (endDis > 10f) { float scale = endDis / _curCustomBitmap.startDis; _curCustomBitmap.matrix.set(currentMatrix); _curCustomBitmap.matrix.postScale(scale, scale, _curCustomBitmap.midPoint.x, _curCustomBitmap.midPoint.y); _curCustomBitmap.matrix.postRotate(rotation, _curCustomBitmap.midPoint.x, _curCustomBitmap.midPoint.y); } } break; case MotionEvent.ACTION_POINTER_UP: // 有手指离开屏幕,但屏幕还有触点(手指) mode = MODE.NONE; break; } invalidate(); return true; } // 查找被点击的图片 private CustomBitmap findClickedBitmap(float x, float y) { for (CustomBitmap bitmap : _bitmaps) { float[] values = new float[9]; bitmap.matrix.getValues(values); float globalX = values[Matrix.MTRANS_X]; float globalY = values[Matrix.MTRANS_Y]; float width = values[Matrix.MSCALE_X] * bitmap.getBitmap().getWidth(); float height = values[Matrix.MSCALE_Y] * bitmap.getBitmap().getHeight(); RectF rect = new RectF(globalX, globalY, globalX + width, globalY + height); if (rect.contains(x, y)) { return bitmap; } } return null; } // 计算两点之间的距离 private float distance(MotionEvent event) { float x1 = event.getX(0); float y1 = event.getY(0); float x2 = event.getX(1); float y2 = event.getY(1); return (float) Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); } // 计算两点之间的旋转角度 private float rotation(MotionEvent event) { float x1 = event.getX(0); float y1 = event.getY(0); float x2 = event.getX(1); float y2 = event.getY(1); double radians = Math.atan2(y2 - y1, x2 - x1); return (float) Math.toDegrees(radians); }

2023-06-06 上传