【雕爷学编程】Arduino 手册之指针运算符->(箭头运算符)

在这里插入图片描述
在这里插入图片描述
什么是Arduino?
Arduino 是一款开源的电子原型平台,它可以让你用简单的硬件和软件来创建各种创意的项目。无论你是初学者还是专家,Arduino 都能为你提供无限的可能性。你可以用 Arduino 来控制传感器、灯光、马达、机器人、物联网设备等等,只要你能想到的,Arduino 都能帮你实现。

如果你想了解更多关于 Arduino 的信息,你可以访问 Arduino 的官方网站,那里有丰富的资源和教程供你参考。你也可以加入 Arduino 的社区,和来自世界各地的爱好者、学生、设计师和工程师交流心得和经验。此外,你还可以使用 Arduino 的在线编程工具,在云端编写代码并上传到你的开发板上。

Arduino 是一个不断发展和创新的平台,它有着广泛的应用领域和潜力。这里希望本手册能激发你对 Arduino 的兴趣和热情,让你享受 Arduino 带来的创造力和乐趣

在这里插入图片描述

维基百科的定义
Arduino 是一个开源嵌入式硬件平台,用来供用户制作可交互式的嵌入式项目。此外 Arduino 作为一个开源硬件和开源软件的公司,同时兼有项目和用户社群。该公司负责设计和制造Arduino电路板及相关附件。这些产品按照GNU宽通用公共许可证(LGPL)或GNU通用公共许可证(GPL)许可的开源硬件和软件分发的,Arduino 允许任何人制造 Arduino 板和软件分发。 Arduino 板可以以预装的形式商业销售,也可以作为 DIY 套件购买。

Arduino 2005 年时面世,作为意大利伊夫雷亚地区伊夫雷亚互动设计研究所的学生设计,目的是为新手和专业人员提供一种低成本且简单的方法,以建立使用传感器与环境相互作用的装置。初学者和爱好者可用Arduino制造传感器、简单机器人、恒温器和运动检测器等装置。

Arduino 这个名字来自意大利伊夫雷亚的一家酒吧,该项目的一些创始人过去常常会去这家酒吧。 酒吧以伊夫雷亚的 Arduin(Arduin of Ivrea)命名,他是伊夫雷亚边疆伯爵,也是 1002 年至 1014 年期间的意大利国王。

在这里插入图片描述

Arduino 系列电路板的设计大多使用 Atmel AVR 单片机。这些电路板配有一组数字和模拟I/O引脚,可以连接各种扩展板或面包板(Shields 扩展版)和其他电路。这些电路板具有串行端口,包括某些型号上的通用串行总线(USB),也用于从个人电脑加载程序。

软件编程方面,通常使用C/C++程序语言,官方提供了一个Arduino IDE用开发。除了使用传统的编译工具链之外,Arduino 项目还提供了一个基于 Processing 语言项目的集成开发环境。另外,一些少儿编程教育软件提供了对 Arduino 的可视化编程。

在这里插入图片描述

七、Arduino指针运算符
是用于操作指针的符号,指针是一种特殊的变量,它可以存储另一个变量的地址。指针运算符有以下几种:
&(引用运算符):用于获取一个变量的地址,并赋值给一个指针。例如,如果x是一个变量,那么&x表示x的地址。
(解引用运算符):用于获取一个指针所指向的变量的值,并赋值给另一个变量。例如,如果p是一个指针,那么p表示p所指向的变量的值。
->(箭头运算符):用于访问一个指针所指向的结构体或类的成员。例如,如果p是一个指向结构体或类的指针,那么p->a表示p所指向的结构体或类的成员a。
[](下标运算符):用于访问一个数组或字符串的元素。例如,如果a是一个数组或字符串,那么a[i]表示a的第i个元素。实际上,a[i]等价于
(a+i),即先将a作为一个指针加上i,然后解引用得到元素。

3、->(箭头运算符)
是一种用于访问结构体或类的成员的运算符。它的一般形式为:

指针变量->成员名

它的含义是:先通过指针变量找到它所指向的结构体或类的对象,然后再访问该对象的指定成员。它相当于以下形式:

(*指针变量).成员名

其中,*指针变量是一个结构体或类的对象,.是另一种访问成员的运算符。->运算符可以简化这种写法,使代码更简洁和易读。

->运算符的应用场景主要有以下几种:

1)当我们需要动态分配内存空间来存储结构体或类的对象时,我们通常使用指针来接收返回的地址,然后通过->运算符来访问对象的成员。例如:

//定义一个学生结构体
struct Student {
  int id;
  char name[20];
  float score;
};

//在setup函数中动态分配内存空间,并赋值
void setup() {
  //创建一个指向Student结构体的指针变量
  Student* stu = (Student*)malloc(sizeof(Student));
  //通过->运算符给对象赋值
  stu->id = 1;
  strcpy(stu->name, "Alice");
  stu->score = 95.5;
  //打印对象的信息
  Serial.begin(9600);
  Serial.print("ID: ");
  Serial.println(stu->id);
  Serial.print("Name: ");
  Serial.println(stu->name);
  Serial.print("Score: ");
  Serial.println(stu->score);
}

void loop() {
}

2)当我们需要使用链表这种数据结构时,我们通常使用指针来连接每个节点,然后通过->运算符来访问节点的数据和下一个节点的地址。例如:

//定义一个链表节点结构体
struct Node {
  int data; //节点存储的数据
  Node* next; //节点指向的下一个节点的地址
};

//在setup函数中创建一个链表,并打印它
void setup() {
  //创建三个节点,并赋值
  Node* node1 = (Node*)malloc(sizeof(Node));
  node1->data = 10;
  Node* node2 = (Node*)malloc(sizeof(Node));
  node2->data = 20;
  Node* node3 = (Node*)malloc(sizeof(Node));
  node3->data = 30;
  
  //将三个节点连接起来,形成一个链表
  node1->next = node2;
  node2->next = node3;
  node3->next = NULL; //链表的最后一个节点的next为NULL
  
  //打印链表中每个节点的数据
  Serial.begin(9600);
  
  //创建一个临时指针变量,用于遍历链表
  Node* temp = node1; //从第一个节点开始
  
  while (temp != NULL) { //当temp不为NULL时,说明还有节点未遍历
    Serial.println(temp->data); //打印当前节点的数据
    temp = temp->next; //将temp指向下一个节点
  }
}

void loop() {
}

3)当我们需要使用面向对象编程时,我们通常使用指针来创建类的对象,然后通过->运算符来访问对象的属性和方法。例如:

//定义一个LED类
class LED {
private:
  int pin; //LED连接的引脚号
public:
  //LED类的构造函数,用于初始化对象
  LED(int p) {
    pin = p; //将参数p赋值给pin
    pinMode(pin, OUTPUT); //将pin设置为输出模式
    digitalWrite(pin, LOW); //将pin输出低电平,关闭LED
  }
  
  //LED类的方法,用于打开LED
  void turnOn() {
    digitalWrite(pin, HIGH); //将pin输出高电平,打开LED
    Serial.println("LED is on"); //打印信息到串口监视器
  }
  
   //LED类的方法,用于关闭LED
  void turnOff() {
    digitalWrite(pin, LOW); //将pin输出低电平,关闭LED
    Serial.println("LED is off"); //打印信息到串口监视器
  }
};

//在setup函数中创建一个LED类的对象,并使用它
void setup() {
  //创建一个指向LED类的指针变量,并使用new运算符动态分配内存空间
  //同时调用LED类的构造函数,传入参数13,表示LED连接到13号引脚
  LED* led = new LED(13);
  
  //打开串口通信,波特率为9600
  Serial.begin(9600);
  
  //通过->运算符调用对象的方法,打开LED
  led->turnOn();
  
  //延时1秒
  delay(1000);
  
  //通过->运算符调用对象的方法,关闭LED
  led->turnOff();
}

void loop() {
}

->运算符的注意事项主要有以下几点:

1)->运算符只能用于指针变量,不能用于普通变量。如果要访问普通变量的成员,可以使用.运算符。
2)->运算符的优先级高于赋值运算符=,所以在给成员赋值时,不需要加括号。例如:stu->id = 1;正确,stu->(id) = 1;错误。
3)->运算符不能连续使用,如果要访问多层嵌套的成员,可以使用括号和*运算符。例如:(*stu->next)->id表示访问stu指向的下一个节点的id成员。

当在Arduino(C++)中使用箭头运算符->时,它通常被用于访问指针所指向的对象的成员。下面是三个实际运用程序案例,展示了->运算符的使用:

1)访问结构体指针的成员(Accessing members of a struct pointer):

struct Person {
  string name;
  int age;
};

void setup() {
  Person* ptr = new Person;
  ptr->name = "John";
  ptr->age = 30;

  cout << "Name: " << ptr->name << endl;
  cout << "Age: " << ptr->age << endl;

  delete ptr;
}

2)在上述示例中,我们定义了一个名为Person的结构体,具有nameage两个成员变量。我们创建了一个指向Person结构体的指针ptr,然后使用箭头运算符->来访问指针所指向的结构体对象的成员。

访问类指针的成员(Accessing members of a class pointer):

class MyClass {
private:
  int value;

public:
  void setValue(int val) {
    value = val;
  }

  int getValue() {
    return value;
  }
};

void setup() {
  MyClass* ptr = new MyClass;
  ptr->setValue(42);

  cout << "Value: " << ptr->getValue() << endl;

  delete ptr;
}

在这个示例中,我们定义了一个名为MyClass的类,具有私有成员变量value和公共成员函数setValuegetValue。我们创建了一个指向MyClass类的指针ptr,然后使用箭头运算符->来访问指针所指向的类对象的成员函数和成员变量。

3)访问类对象的动态分配成员(Accessing dynamically allocated members of a class object):

class MyClass {
private:
  int* dynamicArray;

public:
  MyClass() {
    dynamicArray = new int[5];
  }

  ~MyClass() {
    delete[] dynamicArray;
  }

  int getValueAtIndex(int index) {
    return dynamicArray[index];
  }
};

void setup() {
  MyClass obj;
  obj.getValueAtIndex(2);  // 直接访问对象的成员函数

  MyClass* ptr = new MyClass;
  ptr->getValueAtIndex(2);  // 使用箭头运算符访问对象指针的成员函数

  delete ptr;
}

在这个示例中,我们定义了一个名为MyClass的类,具有一个动态分配的整数数组dynamicArray。我们在类的构造函数中分配了内存,并在析构函数中释放内存。我们可以使用箭头运算符->来访问指针所指向的类对象的成员函数和成员变量。

这些示例展示了箭头运算符->的实际应用。它可以用于访问指针所指向的对象的成员函数和成员变量,包括结构体、类和动态分配的对象等。通过箭头运算符,我们可以方便地操作和处理指针所指向的对象的成员。

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
编程Arduino动手做寻迹的实验可以使用TCRT5000红外反射光电开关寻迹传感器模块。这个传感器模块可以通过检测周围的光反射来进行寻迹操作。你可以将这个模块连接到mBot的主控板mCore V1.5的RJ25接口上,因为mBot的主控板兼容Arduino系统,所以你可以使用Arduino编程语言来控制mBot进行寻迹操作。请参考【Arduino】168种传感器模块系列实验中的实验六十六,该实验详细介绍了如何使用TCRT5000红外反射光电开关寻迹传感器模块进行寻迹。祝你成功完成实验!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【编程Arduino动手做(194)---makeblock mbot 主控板2](https://blog.csdn.net/weixin_41659040/article/details/132141677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [【编程Arduino动手做(65)---红外寻迹传感器](https://blog.csdn.net/weixin_41659040/article/details/106604080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值