拿下大怪兽——指针

用Python做一个奥特曼打怪兽的小游戏 话不多说,往下看吧! 引入需要的模块 from sprites import * from pygame import mixer 设置页面格式(宽高等等) width,height = 800,600 screen = Screen() screen.setup(width,height) screen.bgcolor('black') screen.title('奥特曼打怪兽by 代码看主页领') 封面角色 frames = [f"frames/{i:04d}.png" for i in range 阅读详情

目录

一、指针数组

指针数组模拟二维数组

二、数组指针

数组指针理解二维数组传参本质

三、字符指针变量

四、函数指针变量

五、函数指针数组

六、结构体指针

 七、联合体指针


一、指针数组

        所谓指针数组,就是每个元素都是用来存放地址(指针)的。

        指针数组的每个元素是地址,又可以指向⼀块区域

指针数组模拟二维数组

#include <stdio.h>
int main()
{
     int arr1[] = {1,2,3,4,5};
     int arr2[] = {2,3,4,5,6};
     int arr3[] = {3,4,5,6,7};
     //数组名是数组⾸元素的地址,类型是int*的,就可以存放在parr数组中
     int* parr[3] = {arr1, arr2, arr3};
     int i = 0;
     int j = 0;
     for(i=0; i<3; i++)
     {
         for(j=0; j<5; j++)
         {
             printf("%d ", parr[i][j]);
         }    
     printf("\n");
     }
    return 0;
}

        parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型一维数组,parr[i][j]就是整型一维数组中的元素。

        上述的代码模拟出二维数组的效果,实际上并非完全是二维数组,因为每一行并非是连续的。

二、数组指针

int (*p)[10];

解释:

        p先和*结合,说明p是一个指针变量,然后指向的是一个大小为10个整型元素的数组。

        所以 p是一个指针,指向一个数组,叫数组指针。

这里要注意:

        []的优先级要高于*号的,所以必须加上()来保证p先和*结合。

数组指针变量是用来存放数组地址的,那怎么获得数组的地址呢?就是我们之前学习的 &数组名 

数组指针理解二维数组传参本质

首先我们理解一下二维数组,二维数组起始可以看做是每个元素是一维数组的数组,也就是二维数组的每个元素是一个一维数组。那么二维数组的首元素就是第一行,是个一维数组。

所以,二维数组传参本质上也是传递了地址,传递的是第一行这个一维数组的地址,那么形参也是可以写成指针形式的 

根据下面的例子,第一行的一维数组的类型就是 int [5] ,所以第一行的地址的类型就是数组指针类型 int(*)[5]

#include<stdio.h>
void test(int (*p)[5], int r, int c)
{
    int i = 0;
    int j = 0;
    for(i=0; i<r; i++)
    {
        for(j=0; j<c; j++)
        {
            printf("%d ", *(*(p+i)+j));
        }
         printf("\n");
    }
}
int main()
{
     int arr[3][5] = {{1,2,3,4,5}, {2,3,4,5,6},{3,4,5,6,7}};
     test(arr, 3, 5);
     return 0;
}

总结:

二维数组传参,形参的部分可以写成数组,也可以写成指针形式。

三、字符指针变量

char* ; //指向的字符串不能被修改,因为其具备了常属性

一般使用:

int main() 
{
     char ch = 'w';
     char *pc = &ch;
     *pc = 'w'; 
     return 0; 
}

还有一种使用方式如下:

#include<stdio.h>
int main() 
{ 
    const char* pstr = "hello bit.";
    //这⾥是把⼀个字符串放到pstr指针变量⾥了吗?
     printf("%s\n", pstr);
     return 0; 
} 

代码 const char* pstr = "hello bit."; 特别容易让同学以为是把字符串 hello bit 放到字符指针 pstr 里了,但是本质是把字符串 hello bit. 首字符的地址放到了pstr中。 

四、函数指针变量

        函数指针变量应该是用来存放函数地址的,未来通过地址能够调用函数的。

        函数是有地址的,函数名就是函数的地址,当然也可以通过 &函数名 的方式获得函数的地址。

        如果我们要将函数的地址存放起来,就得创建函数指针变量,函数指针变量的写法其实和数组指针非常类似。如下: 

#include <stdio.h>
int Add(int x, int y)
{
     return x+y;
}
int main()
{
     int(*pf3)(int, int) = Add;
     printf("%d\n", (*pf3)(2, 3));
     printf("%d\n", pf3(3, 5));
     return 0;
}

五、函数指针数组

int (*parr1[3])();

 parr1 先和 [] 结合,说明 parr1是数组,数组的内容是什么呢? 是 int (*)() 类型的函数指针。

用途举例:

计数器的实现——转移表

#include <stdio.h>
int add(int a, int b)
{
	return a + b;
}
int sub(int a, int b)
{
	return a - b;
}
int mul(int a, int b)
{
	return a * b;
}
int div(int a, int b)
{
	return a / b;
}
int main()
{
	int x, y;
	int input = 1;
	int ret = 0;
	int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
	do
	{
		printf("*************************\n");
		printf(" 1:add 2:sub \n");
		printf(" 3:mul 4:div \n");
		printf(" 0:exit \n");
		printf("*************************\n");
		printf("请选择:");
		scanf("%d", &input);
		if ((input <= 4 && input >= 1))
		{
			printf("输⼊操作数:");
			scanf("%d %d", &x, &y);
			ret = (*p[input])(x, y);
			printf("ret = %d\n", ret);
		}
		else if (input == 0)
		{
			printf("退出计算器\n");
		}
		else
		{
			printf("输⼊有误\n");
		}
	} while (input);
	return 0;
}

六、结构体指针

以下给出两个例子来理解结构体指针

int main()
{
  unsigned char puc[4];
  struct tagPIM
  {
    unsigned char ucPim1;
    unsigned char ucData0 : 1;
    unsigned char ucData1 : 2;
    unsigned char ucData2 : 3;
  }*pstPimData;
  pstPimData = (struct tagPIM*)puc;
  memset(puc,0,4);
  pstPimData->ucPim1 = 2; 
  pstPimData->ucData0 = 3;
  pstPimData->ucData1 = 4;
  pstPimData->ucData2 = 5;
  printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]);//02 29 00 00
  return 0;
}
#include <stdio.h>

// 定义一个结构体
typedef struct {
    int id;
    char name[50];
    float salary;
} Employee;

int main() {
    // 创建一个结构体变量
    Employee emp = { 1, "John Doe", 50000.0 };

    // 创建一个指向结构体的指针
    Employee* ptr = &emp;

    // 使用指针访问结构体的成员
    printf("Employee ID: %d\n", ptr->id); // 使用箭头操作符(->)
    printf("Employee Name: %s\n", ptr->name);
    printf("Employee Salary: %.2f\n", ptr->salary);

    return 0;
}

 七、联合体指针

//在X86下,小端字节序存储
#include<stdio.h>
int main()
{
  union
  {
    short k;
    char i[2];
  }*s, a;
  s = &a;
  s->i[0] = 0x39;
  s->i[1] = 0x38;
  printf("%x\n", a.k);//3839
  return 0;
}

Python奥特曼打怪兽射击游戏,基于海龟画图创作的作品 相信这竟然是Python用海龟画图制作的作品吗? sprites模块就是用python的turtle模块开发的!所以本作品仍属于Python海龟画图作品 """ 奥特曼打怪兽射击游戏,本程序需要pygame的混音器支持,所以需要安装pygame模块才能正常运行。 游戏操作方法:用鼠标指针牵引奥特曼,单击左键射击,碰到怪兽奥特曼死亡,杀死100个游戏成功结束。 """ from sprites import * from pygame import mixer width,he 阅读详情

相关推荐

C++【QT系列】手搓软件 -切图怪兽

一款可以对图片进行自定义网格式裁切的软件,小巧但是功能强大!

Zalamp的博客 461

C语言“大怪兽”--指针详解(一)

1.在生活中有朋友来到你家小区找你玩,倘若没有告知他楼层和门牌号,他就要在偌大的小区一户户找,可见效率之低,但如果我们根据楼层和门牌号去编号,就会得到502、603、1502...等等房间号,朋友就可以通过房间号迅速定位到你的具体位置。好了,以上就是指针系列的第一篇博客啦,希望我的分享能让大家更详细了解指针,如果文章中有错误的地方,还请大佬评论区指正,欢迎大家提出意见。void*指针是用来接收不同类型数据的地址,当我们不知道指针是什么类型的,就可以使用void*接收,这样的设计可以实现泛型编程的效果。

2301_81250340的博客 1041

GBC游戏逆向工程实战:在开源掌机上修改《勇者斗恶龙怪兽仙境》

游戏逆向工程是理解软件底层运行机制的重要技术领域,其核心原理在于通过静态分析和动态调试,解析程序的代码逻辑与数据结构。这项技术的价值在于,它不仅能满足玩家对游戏进行个性化定制的需求,更是学习计算机体系结构、汇编语言和内存管理的绝佳实践。在复古游戏和开源硬件蓬勃发展的今天,以Game Boy Color(GBC)平台为代表的8位游戏机,因其硬件架构相对简单、社区资料丰富,成为了逆向工程入门的理想沙盒。通过使用BGB调试器、十六进制编辑器等工具,爱好者可以定位并修改游戏ROM中的关键数据,例如角色属性和游戏资源

weixin_33874713的博客 458

C语言“大怪兽”--指针详解(二)

前面我们已经学习了指针的基本概念,接下来我们继续深入指针世界!

2301_81250340的博客 495

bug 就像隐藏在暗处的小怪兽

bug 就像隐藏在暗处的小怪兽

敲代码无敌小奶龙的博客 966

C++ 指针详解

在 C++ 中,有很多指针相关的概念,这些概念都很简单,但是都很重要。下面列出了 C++ 程序员必须清楚的一些与指针相关的重要概念: 第一部,哈利波特与魔法石:哈利。波特:小说主角,一岁时父母被邪恶巫师杀害,被姨妈收养,后到霍格瓦彻魔法学校学习魔法。 维能。杜斯利先生:哈利的姨丈。玛各:维能的妹妹。帕尤妮亚:哈利的姨妈。达德里:杜斯利的儿子,整天欺负哈利。莉莉和杰姆斯。波特:哈利的妈妈爸爸,曾是霍格瓦彻魔法学校优秀学生,后被邪恶巫师杀害。艾伯斯。丹伯多:霍格瓦彻魔法学校校长,著名魔法家。麦康娜:霍格瓦彻学校

小天狼星_布莱克 的博客 494

C语言“大怪兽”--指针详解(三)

这段代码本质上是首字符h的地址存放到pstr中,也就是把一个常量字符串的首字符的地址放到指针变量中,接下来我们看一道相关题目。这就意味着我们假设 0 地址处放着无参,返回类型是void的函数, 最后是调用0地址处放的这个函数。( void(*)() )0 --将0强制类型转化为void(*)() 的函数指针类型。数组指针,顾名思义是指针变量,存放的是数组的地址,是能够指向数组的指针变量。typedef是一个关键字,是用来类型重命名的,可以将复杂的类型简单化。base:指向要排序的数组的第一个元素的指针。

2301_81250340的博客 637

基于Arduino与脑电模块的意念控制LED灯环实现

脑机接口(BCI)技术通过采集和处理脑电信号,实现人脑与外部设备的直接交互。其核心原理是利用传感器捕捉大脑活动产生的微弱电信号,经过放大、滤波和特征提取,转换为可识别的指令。这项技术在医疗康复、神经反馈训练和人机交互等领域具有重要价值。本文聚焦于一个具体的工程实践:使用消费级NeuroSky TGAM模块采集专注度与放松度数据,通过Arduino平台解析信号,并驱动WS2812B LED灯环实现实时可视化反馈。项目涵盖了硬件选型、电路搭建、数据解析和光效映射等关键环节,为脑机接口入门和嵌入式开发提供了完整的

weixin_28721917的博客 275

码蹄集周赛复题——消灭怪兽

一开始暴力思路:想从血量从大到小排序之后按照要求依次减少血量直至抹杀,但是没全通过T_T题解思路:血量从少到多排序,用sum[i]记录血量从高到低直至第i个怪兽的分数和,用t记录累计要扣除的血量。累计过程中若第idx个怪兽的血量不够扣除则向后移动idx,当op=2时直接输出sum[idx]即为所有存活的怪兽分数。

weixin_45816431的博客 425

机器学习---xgboost算法

问题上表现的十分顶尖,本节将较详细的介绍XGBoost的算法原理。成和剪枝分别对应了经验风险最小化和结构风险最小化, XGBoost的决策树生成是结构风险最小。式(1.1)称为经验风险最小化,训练得到的模型复杂度较高。出结果, 是模型的输出结果;等式右边第⼀部分是模型的训练误差,第⼆部分是正则化项,这里。其中,F是假设空间,假设空间是在已知属性和属性可能取值的情况下,对所有可能满足目标的情。最小化,结构风险最小化的模型往往对训练数据以及未知的测试数据都有较好的预测。的正则化项是K棵树的正则化项相加而来的。

weixin_43961909的博客 1万+

STM32H743IIT6+USB3300高速HID通讯实战:从CUBEMX配置到调试避坑全记录

本文详细记录了基于STM32H743IIT6微控制器与USB3300 PHY芯片实现高速USB HID通信的完整实战过程。内容涵盖从硬件选型、STM32CubeMX工程配置(重点规避引脚映射等常见陷阱)、自定义报告描述符编写,到驱动层数据收发实现与高级调试技巧的全链路解析,旨在帮助开发者快速构建稳定、高效的嵌入式高速数据通道。

vscode5coder的博客 362

Python奥特曼打怪兽射击游戏(基于海龟画图创作的作品,来自Python创意编程100例sprites篇_Python精灵模块)

相信这竟然是Python用海龟画图制作的作品吗? sprites模块就是用python的turtle模块开发的!所以本作品仍属于Python海龟画图作品 """ 奥特曼打怪兽射击游戏,本程序需要pygame的混音器支持,所以需要安装pygame模块才能正常运行。 游戏操作方法:用鼠标指针牵引奥特曼,单击左键射击,碰到怪兽奥特曼死亡,杀死100个游戏成功结束。 ...

李兴球的专栏 1万+

破解雪球网acw_sc__v2加密与无限debugger反爬策略

本文详细解析了雪球网的反爬机制,重点破解了其核心的acw_sc__v2加密参数与无限debugger反调试策略。通过实战案例,从抓包分析、逆向调试到算法还原,提供了完整的Python代码实现,帮助开发者掌握应对类似加密反爬的通用方法。

weixin_29207533的博客 1897

HDU 6563 Strength(贪心 双指针)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6563 题目描述比较长,容易读错题 题意: 你有n个怪兽,对方有m个怪兽,每只怪兽有相应的攻击值。两只x和y怪兽pk(一只你的,一只对方的),如果x攻击值>y攻击值,对方将受到x-y伤害(前提是对方的这只怪兽是普通怪兽),同时对方的这只怪兽ko;如果x攻击值==y攻击值,那么这2只怪兽同归于尽;如...

weixin_43918473的博客 397

【教程4>第3章>第1节】通信系统高阶调制解调概述

高阶调制(High Order Modulation)是一种先进的数字调制技术,旨在通过增加每个符号携带的信息比特数来提高无线通信系统的数据传输速率和频谱效率。这种技术特别适用于具有较高信噪比(Signal-to-Noise Ratio, SNR)的通信环境,例如卫星通信、光纤通信以及一些高质量的无线通信链路。在数字通信中,调制是将数字信号(比特流)转换为适合在物理信道上传输的模拟信号的过程。高阶调制通过使用更多的信号状态或星座点来表示不同的比特组合,从而在一个符号周期内传输更多的信息。

FPGA/MATLAB学习教程/源码/项目合作开发 1701

Linux 4.19、Linux 5.10、Linux 6.1 三个版本详细分析

Linux 4.19发布日期:2018年10月22日LTS 状态:是长期支持版本,官方支持到2024年12月。Linux 5.10发布日期:2020年12月13日LTS 状态:LTS 版本,官方支持到2026年12月。Linux 6.1发布日期:2022年12月11日LTS 状态:不是官方的LTS版本,但通常社区会为新的版本提供一定时间的支持。定位:稳定性和长期支持,广泛应用于多种平台,尤其是嵌入式系统和服务器。主要优势:稳定性高,广泛的硬件支持,核心功能可靠。

小灰灰的博客 5949

C语言 指针 数组指针 遍历

C语言 指针 数组指针 遍历

weixin_46068274的博客 4417

视觉Transformer实战 | Transformer详解与实现

本文系统介绍了 Transformer 架构的核心原理与实现。相比传统 RNN 和 CNN,Transformer 凭借自注意力机制有效捕捉序列中的长距离依赖关系,支持并行训练,显著提升效率。其核心创新在于通过查询、键、值向量计算注意力权重,理解单词间的语义关联。架构包含编码器-解码器结构:编码器通过多头自注意力和前馈网络提取输入特征;解码器利用掩码自注意力和交叉注意力生成输出。本文使用 PyTorch 实现了缩放点积注意力、位置编码、层归一化等关键模块,并构建了完整的 Transformer 模型。

盼小辉丶的博客 4万+

P11231 [CSP-S 2024] 决斗

代码分块展示,会让 读者/学生 思路更加清晰。

weixin_43863957的博客 1063

HTML粉色爱心(完整代码)

HTML语言实现粉色爱心的完整代码。

AIGC 1104

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

卡牌题解(CSP2024ST1改)

通过对怪兽的攻击力和防御力分别进行排序,并采用双指针的方法进行匹配,我们能够高效地计算出在最优攻击策略下,游戏结束时剩余的最少怪兽数量。该方法的时间复杂度为Onlog⁡nOnlogn,适用于题目中nnn达到10610^6106的规模,满足题目的性能要求。此策略确保每次攻击都尽可能地将攻击力小的怪兽用于击败防御力低的怪兽,从而最大化被击败的怪兽数量,最终实现最小化剩余怪兽数的目标。

ZengZiTudor的博客 895

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

CSP-S(提高级)2024年T1 决斗

今天是小 Q 的生日,他得到了n张卡牌作为礼物。这些卡牌属于火爆的“决斗怪兽”,其中,第i张卡代表一只攻击力为ri​,防御力也为ri​的怪兽。一场游戏分为若干回合。每回合,小 Q 会选择某只怪兽i以及怪兽jij,并让怪兽i向怪兽j发起攻击。此时,若怪兽i的攻击力小于等于怪兽j的防御力,则无事发生;否则,怪兽j的防御被打破,怪兽j退出游戏不再参与到剩下的游戏中。一只怪兽在整场游戏中只能发起一次攻击。当未退出游戏的怪兽都已发起过攻击时,游戏结束。

长春高老师编程 1643

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Pudding Monsters CodeForces - 526F (分治, 双指针)

大意: n*n棋盘, n个点有怪兽, 求有多少边长为k的正方形内恰好有k只怪兽, 输出k=1,...,n时的答案和. 等价于给定n排列, 对于任意一个长为$k$的区间, 若最大值最小值的差恰好为k, 则产生1贡献, 求贡献和.考虑分治, 问题就转化为如何$O(n)$求出跨越$mid$的贡献, 可以讨论最大值最小值的位置, 双指针求出. #include <iostream&...

weixin_30917213的博客 157

[CSP-S 2024] 决斗 题目和答案

[CSP-S 2024] 复赛 决斗 题目和答案 C++

m0_51666430的博客 710

照着做,你也可以战胜算法小怪兽

>点击上方“Java Dev”关注<看看你有多少好友也关注了我Photo FromInternet说起学习算法,相信每个程序员都有一段故事,有的人可能是痛苦的,有的人可能是...

SuperStonne的专栏 378

2024CSP 决斗

今天是小 Q 的生日,他得到了 n 张卡牌作为礼物。这些卡牌属于火爆的“决斗怪兽”,其中,第 i 张卡代表一只攻击力为 ri,防御力也为 riri 的怪兽。一场游戏分为若干回合。每回合,小 Q 会选择某只怪兽 ii 以及怪兽 j(i≠j),并让怪兽 i 向怪兽 j 发起攻击。此时,若怪兽 i 的攻击力小于等于怪兽 jj 的防御力,则无事发生;否则,怪兽 j 的防御被打破,怪兽 jj 退出游戏不再参与到剩下的游戏中。一只怪兽在整场游戏中只能发起一次攻击。

2301_80460842的博客 425
上一篇: 【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
下一篇: strcat与strncat函数使用与模拟实现
大力初奇迹
博客等级 码龄3年 1294粉丝 54原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值