【C/C++】指针

【C/C++】指针

目录

1.指针变量

1.1 内存和地址

1.2 指针变量的定义与使用

1.3 指针运算

2. 指针所占用内存空间

3.空指针、野指针

3.1 空指针

3.2 野指针

4.const修饰指针

4.1 const修饰指针

4.2 const修饰常量

4.3 const修饰指针和常量

5.指针和数组

5.1 区分指针数组和数组指针

5.2 利用指针访问数组元素

6. 指针和函数

7. 结构体指针


1.指针变量

1.1 内存和地址

指针就是用来访问内存

内存:房间

地址:门牌号

内存单元的编号=地址=指针

1.2 指针变量的定义与使用

指针变量也是一种变量,这种变量是用来存放地址的,存放在指针变量中的值都会理解为地址

(在指针变量的眼里,什么都是地址)

*在说明pa为指针变量,int说明pa指向的对象a是int类型的

如果是字符类型呢?

 char ch='w';

char *pc=&ch;
#include<iostream> using namespace std; int main() { //1. 指针的定义:数据类型* 变量名 int a = 10; int* p; //给指针变量赋值 p = &a;//指针指向a的地址 cout << p << endl; cout << &a << endl; //2. 指针的使用 cout << "* p =" << *p << endl; cout << "a = " << a << endl; return 0; }
记住!

p = &a

* p = a

* p = * &a = a,*和&抵消

1.3 指针运算

指针类型决定了指针进行+1或-1时,一次走远的距离

int*+1,走4个字节(整形的大小)

char*+1,走1个字节(字符的大小)

void* 无具体类型的指针

不是固定的某一类型的地址,就用void*

2. 指针所占用内存空间

  • 32位平台下地址是32个bit位,指针变量大小是4个字节
  • 64位平台下地址是64个bit位,指针变量大小是8个字节
  • 指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的

×86:

×64:

#include<iostream> using namespace std; int main() { cout << sizeof(int*) << endl; cout << sizeof(float*) << endl; cout << sizeof(double*) << endl; cout << sizeof(char*) << endl; return 0; }

3.空指针、野指针

空指针和野指针都不是我们申请的空间,引出不要访问

3.1 空指针

  • 空指针是不可以进行访问的

空指针用于给指针变量初始化

3.2 野指针

4.const修饰指针

实验一下:

#include<iostream> using namespace std; int main() { int a = 10; int b = 20; //const修饰指针,指针指向可以改,指针指向的值不可以改 const int* p1 = &a; p1 = &b; //*p1 = 100;//报错 //const修饰常量,指针的指向不可以改,指针的值可以改 int* const p2 = &a; //p2 = &b;//报错 *p2 = 100; //const修饰指针和常量, const int* const p3 = &a; //p3 = &b;//报错 //*p3 = 100;//报错 return 0; }

C中const修饰的仍是变量,C++中const修饰的变量是常量

以下三张图中红色为不可修改,黑色为可修改

4.1 const修饰指针

const放在*左边,限制的是:指针指向的内容,不能通过指针来修改指向的内容,但是可以修改指针变量本身的值(修改的指针变量的指向)

4.2 const修饰常量

const放在*右边,限制的是:指针变量本身,指针变量不能再指向其他变量了,但是可以通过修改指针变量修改指针变量指向的内容

4.3 const修饰指针和常量

5.指针和数组

5.1 区分指针数组和数组指针

注意区分指针数组,指针数组是数组,数组指针是指针

字符指针:char*,存放字符的地址

整形指针:int*,存放整形的地址



数组指针:存放数组的地址,指向数组的指针

请思考下面代码的意义?

int* p1[10];

int(*p2)[10];

p1是指针数组,存放指针的数组

p2是指针变量,指向的是数组

5.2 利用指针访问数组元素

访问arr默认就是数组首元素地址

利用for循环逐个访问数组元素

6. 指针和函数

要点:

  • 值传递不会改变实参
  • 地址传递会改变实参

值传递

地址传递

#include<iostream> using namespace std; void swap1(int a, int b) { int temp = a; a = b; b = temp; } //void swap2(int *p1, int *p2) //{ // int temp = *p1; *p1 = *p2; *p2 = temp; //} int main() { int a = 10; int b = 20; swap1(a, b); //swap2(&a, &b); cout << "a=" << a << endl; cout << "b=" << b << endl; return 0; } 

7. 结构体指针

结构体,结构体指针https://blog.ZEEKLOG.net/2301_76153977/article/details/150353517?spm=1001.2014.3001.5501

Read more

Neo4j 知识讲解与在线工具使用教程

图数据库领域的核心工具 ——Neo4j,同时详细拆解其在线预览控制台(https://console-preview.neo4j.io/)的使用方法,以及查询工具(https://console-preview.neo4j.io/tools/query)的模块功能。 一、Neo4j 核心知识铺垫 在使用工具前,我们需要先理解 Neo4j 的本质和核心概念,这是后续操作的基础。 1. 什么是 Neo4j? Neo4j 是世界上最流行的原生图数据库(Native Graph Database),专门用于存储、查询和分析 “实体之间的关联关系”。它与我们熟悉的 MySQL 等关系型数据库的核心差异的是: * 关系型数据库(MySQL):用 “表 + 行 + 外键” 间接表示关联,查询多表关联时需频繁 JOIN,效率低; * 图数据库(Neo4j)

By Ne0inhk
【无人机】无人机路径规划算法

【无人机】无人机路径规划算法

目录 一、引言:无人机与路径规划算法 二、路径规划算法基础 (一)定义与重要性 (二)规划目标与约束条件 三、常见路径规划算法详解 (一)A * 算法 (二)Dijkstra 算法 (三)RRT(快速扩展随机树)算法 (四)蚁群算法 四、算法应用实例与效果展示 (一)不同场景下的算法应用 (二)算法性能对比数据 五、算法的优化与发展趋势 (一)现有算法的优化策略 (二)结合新技术的发展方向 六、挑战与展望 (一)面临的技术挑战 (二)未来应用前景 七、结论 一、引言:无人机与路径规划算法 在科技飞速发展的今天,无人机作为一种极具创新性的技术产物,已深度融入我们生活的方方面面,

By Ne0inhk

简单理解:单片机怎么和FPGA通信

了解单片机与 FPGA 之间的通信方式,这是嵌入式系统中非常常见的硬件交互场景,核心是要根据传输速率、硬件资源、开发复杂度选择合适的通信协议。 一、主流通信方式及实现方案 单片机和 FPGA 通信主要分为并行通信和串行通信两大类,下面按从易到难、从低速到高速的顺序介绍: 1. 通用 IO 口(GPIO)自定义协议(最简单) 适合低速、短距离、数据量小的场景(如按键、状态交互),完全自定义通信规则,开发灵活。 * 硬件连接: * 单片机:1 个输出引脚(发送) + 1 个输入引脚(接收) * FPGA:1 个输入引脚(接收) + 1 个输出引脚(发送) * 需共地,建议加 10K 上拉电阻提高稳定性。 * 单片机端(C 语言,

By Ne0inhk