指针基础相关笔记

本文深入介绍了C语言中的指针,包括内存的地址概念、指针变量、指针类型、野指针及其避免方法、指针运算以及指针与数组的关系。特别强调了野指针的危害和预防措施,如初始化、避免越界和检查有效性。同时,讨论了指针在内存中的运算规则,如指针加减整数和指针关系运算。

目录

一、更新时间

二、初识指针

1.内存的概念

2.指针变量

3.指针与指针类型

4.野指针

 4.1 野指针产生的原因:

 4.2 野指针如何规避:

5.指针运算

 5.1 指针±整数   指针关系运算

 5.2 指针减指针

 5.指针和数组关系

 6.二级指针

 7.指针数组 


一、更新时间

2022.2.12

二、初识指针

1.内存的概念

        内存是一种存储器,所有程序都在内存中运行。将内存分为一个个小的内存单元,每个内存单元大小为一个字节,对内存单元进行编号,这些编号就是内存的地址。

问题1(内存如何编号):以32位机器为例,32为32根地址线,对线通电将电信号转为数字信号,数字信号的组合数量为2的32次方,这些就是内存的编号,也就是这个内存单元的地址。

问题2(一个内存单元多大):一个内存单元为一个字节大B。

        如上图对于a来说,int型为4个字节,对于其地址如图所示。使用指针取地址a时会拿取起始的第一个字节的地址。打印出来a的地址如下图所示。

2.指针变量

        如下图所示定义一个指针变量,用于存储地址的变量为指针变量,对于iint* pa来说,pa为指针变量,而int说明pa执行的对象为int类型。

        通过地址找到其内部存储的单元,也就是说可以通过操作地址的方式来间接改变a的值。使用解引用操作符*可以通过pa里面的地址寻找到a,并对a的值进行修改。如下图所示。

         在32位编译器中指针变量大小都为4位,在64位编译器中指针变量大小都为8位。指针是用于存放地址的,指针多大取决于地址多大。也就是说32位也就是4个字节大B,64位就是8个字节大B。

3.指针与指针类型

        不是说指针变量都为4个字节指针类型就没有意义,不同类型的指针类型决定了指针解引用的权限。比如int型的指针能访问4个字节,而char型只能访问一个字节,也就是说包括在打印时也能看到,整形指针加1地址会加4,而字符型指针加1地址只会加1。

        指针类型决定了指针走一步走多远,或者说是能走几个地址。

        下面的例子很好的说明了这种情况,将本是0的数组变成了全为1。在加一与解引用的时候都为整形的4个字节。

4.野指针

        野指针就是指针指向的位置是不可知的

 4.1 野指针产生的原因:

        1.指针没有初始化造成非法访问内存

int main()
{
    int* p ;//局部变量没有初始化,默认为随机值
    *p = 20;
    return 0;
}

        2.指针越界,指向不该指向的范围

int main()
{
    int arr[10] = { 0 };
    int* p = arr;
    int i = 0;
    for (i = 0;i <= 10;i++)//循环了11次,最后一次指向了不应该指向的地方
    {
        *p = i;
        p++;
    }
    return 0;
}

        3.指针指向的空间被释放(指向的地址用完后被还给操作系统但是指针还记录着地址)

        比如说有一个女朋友,没有分手的时候可以去她家和她住;有一天分手了,即使你仍然记得她家的位置,也不能再去她家找她住了,因为她不是属于你的女朋友了,如果强行根据你记住的地址去访问她家这就是一种非法行为。

#include <stdio.h>

int* test()
{
    int a = 10;
    return &a;
}
int main()
{
    int* p = test();//此时函数test已经执行完,局部变量a已经被释放,只是返回了地址
    *p = 20;//地址已经不属于a了,此时已经属于非法访问内存
    return 0;
}

 4.2 野指针如何规避:

        1.指针初始化(不知道当前该初始化为啥时候,直接初始化为NULL);

        2.小心指针越界(C语言本身不能检查数组的越界行为);

        3.指针使用前检查其有效性(        if( p ! = NULL )        );

        4.指针的指向空间被释放时及时放置NULL。

5.指针运算

 5.1 指针±整数   指针关系运算

#include <stdio.h>
#define N 5
float value[N];
float* vp;

int main()
{
    for (vp = &value[0];vp < &value[N];)//指针的关系运算
    {
        *vp++=0;//指向下一个数组地址元素将其赋值为0
    }
}

 5.2 指针减指针

        指针减去指针等于两者之间元素个数。注意指针与指针相减的前提是两个指针指向同一块空间。

 5.指针和数组关系

         数组名为数组首元素的首地址

 6.二级指针

         对于指针变量来说,也有自己存放的地址。如果多级指针想要找到一级指针的地址的变量值,有几级就解引用几次。

 7.指针数组 

#include <stdio.h>

int main()
{
	int arr[10];//存放整形的数组
	char ch[10];//存放字符的数组
	int* parr[5];//存放整形指针的数组
	return 0;
}

内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值