深入了解指针(1)

本文详细介绍了C语言中指针的概念,包括指针作为内存地址的访问工具,指针变量的定义、类型和大小,以及const修饰符的应用。同时探讨了void*指针、野指针的产生原因和处理,以及传值调用与传址调用的区别。

内存与地址

学习指针,我们首先要了解指针,指针是用来访问内存的。举个例子,就像过节走亲访友,首先我们要知道地址,才可以去拜访。那么指针的作用就是地址,用于以后可以轻松的访问到内存。也可以这么理解:内存的单元编号==地址==指针。

指针变量与地址

&,在C语言中,名为取地址的操作符,例如:

int main()
{
    int a=0;
    printf("%p",&a);
    return 0;
}

这样便可以得到a的地址。

得到的地址p也是一个变量,其中存放的是a的地址。那我们该如何定义这种变量呢?

指针类型

定义指针首先要了解指针的类型,有int型,有char型,还有float型......

其次我们还要知道一个解引用的操作符(*)

//整型
int a=20;
int*p=&a;

指针变量的大小

有地址总线决定,我们知道,计算机有32位也有64位,所以指针的大小也有两种,四个字节和八个字节,其中32位有32个比特位,也就是4个字节,64位则是8个字节。而且指针的大小与前面说的指针的类型不同,指针的大小只和平台有关,与指针的类型无关。

指针类型的意义

指针的类型决定了对指针解引用时的权限大小(一次可以操作几个字符)

例如;char*的指针只能访问一个字节,int*的指针可以访问四个字节。

指针+-整数

上面我们说了char*与int*的区别,所以他们+-一个整数的结果也是不一样的。

char*类型的指针+1跳过一个字节,而int*类型的指针+1跳过4个字节。

所以结论:指针类型决定了指针向前或者向后走一步的距离大小。

void*指针

上面介绍的指针在定义时我们知道其类型,而如果我们并不知道的话,便可以用void*指针,

void*指针可以理解为无具体类型的指针(泛型指针)可以接受任何类型的地址,但是这类指针并不可以直接进行+-整数的操作,也不可以进行解引用的操作。所以我们一般使用在函数参数的部分,用来接收不同类型数据的地址,实现泛型编程的效果。

const修饰指针

const修饰变量

通过使用const修饰,可以使一个变量具有常属性,但本质上还是变量(在c++中const修饰后变量会变成常量)具有常属性之后,这个变量变得不可被修改,但是通过指针我们依旧可以改变存在一个变量里面的值,如:

可以看出n的值改变了,这是不符合const限制的,所以是不合理的,那么如何让指针也无法改变const定义后的变量的值呢?

const修饰指针变量

如果const放在*左边修饰的是指针内容,指针内容就不会发生改变。但是指针变量本身可以改变。

运行后我们可以发现,n所指的值还是10,即所存的数值没有改变。但是p的指向改变了。

int main()
{
    int n=10;
    int m=20;
    int const * p=&n;
    *p=20;
    p=&m
}

相反的,如果放在*右边的话,p中所存放的值会发生改变,而p的指向并不会发生改变,*p不变。

如果*前后都有const限制的话,那么两个值都不会发生改变。

指针运算

分为三种:指针+-整数;指针-指针;指针的关系运算(指针比较大小)。

注意:指针-指针的运算方式的两个指针指向同一块空间。

野指针

概念:就是指针指向的位置是不可知的(随机的,不正确的,没有限制的)

产生野指针的原因

1.指针未初始化

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

2.指针的越界访问

如出现在数组当中,超出数组的大小。

3.指针指向的空间释放

不能返回局部变量的地址。

assert断言

assert()括号内只要是表达式都可以,如果表达式的结果为假,assert()就会报错,使程序的执行中止。可以用来判断一个指针是否是一个空指针。

#include<assert.h>

是他的头文件。

传值调用和传址调用

传址调用,可以让函数和主调函数(不是主函数,是自己创建的函数)之间建立真正的联系,,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数的变量值来实现计算,就可以采用传值调用(人话:只用不改变)如果函数内部要修改主调函数中变量的值,就需要传址调用。

结语:关于指针的学习并没有结束,后续还会有更多关于指针的介绍。

该数据集通过合成方式模拟了多种发动机在运行过程中的传感器监测数据,旨在构建一个用于机械系统故障检测的基准资源,特别适用于汽车领域的诊断分析。数据按固定时间间隔采集,涵盖了发动机性能指标、异常状态以及工作模式等多维度信息。 时间戳:数据类型为日期时间,记录了每个数据点的采集时刻。序列起始于2024年12月24日10:00,并以5分钟为间隔持续生成,体现了对发动机运行状态的连续监测。 温度(摄氏度):以浮点数形式记录发动机的温度读数。其数值范围通常处于60至120摄氏度之间,反映了发动机在常规工况下的典型温度区间。 转速(转/分钟):以浮点数表示发动机曲轴的旋转速度。该参数在1000至4000转/分钟的范围内随机生成,符合多数发动机在正常运转时的转速特征。 燃油效率(公里/升):浮点型变量,用于衡量发动机的燃料利用效能,即每升燃料所能支持的行驶里程。其取值范围设定在15至30公里/升之间。 振动_X、振动_Y、振动_Z:这三个浮点数列分别记录了发动机在三维空间坐标系中各轴向的振动强度。测量值标准化至0到1的标度,较高的数值通常暗示存在异常振动,可能与潜在的机械故障相关。 扭矩(牛·米):以浮点数表征发动机输出的旋转力矩,数值区间为50至200牛·米,体现了发动机的负载能力。 功率输出(千瓦):浮点型变量,描述发动机单位时间内做功的速率,取值范围为20至100千瓦。 故障状态:整型分类变量,用于标识发动机的异常程度,共分为四个等级:0代表正常状态,1表示轻微故障,2对应中等故障,3指示严重故障。该列作为分类任务的目标变量,支持基于传感器数据预测故障等级。 运行模式:字符串类型变量,描述发动机当前的工作状态,主要包括:怠速(发动机运转但无负载)、巡航(发动机在常规负载下平稳运行)、重载(发动机承受高负荷或高压工况)。 数据集整体包含1000条记录,每条记录对应特定时刻的发动机性能快照。其中故障状态涵盖从正常到严重故障的四级分类,有助于训练模型实现故障预测与诊断。所有数据均为合成生成,旨在模拟真实的发动机性能变化与典型故障场景,所包含的温度、转速、燃油效率、振动、扭矩及功率输出等关键传感指标,均为影响发动机故障判定的重要因素。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
指针是C语言中非常强大但又容易出错的特性之一。深入了解指针有助于编写高效、灵活的代码,也能帮助我们更好地理解底层内存操作。 ### 一、指针的基本概念 指针是一个变量,其值为另一个变量的地址。在C语言中,每个变量都有一个内存地址,我们可以使用 `&` 运算符获取变量的地址,并使用 `*` 运算符声明指针和访问指针所指向的值。 ```c int a = 10; int *p = &a; // p 是指向 int 的指针,保存了 a 的地址 printf("a 的值: %d\n", *p); // 通过指针访问 a 的值 ``` ### 二、指针的本质 指针的本质是一个地址。在内存中,每一个字节都有一个唯一的地址编号(内存地址)。指针变量中存储的是某个变量在内存中的起始地址。 ### 三、指针的类型 指针是有类型的,比如 `int*`、`char*`、`float*` 等。指针类型决定了指针所指向的数据类型,也决定了指针在进行加减运算时的步长。 ```c int arr[3] = {1, 2, 3}; int *p = arr; p++; // 指针移动的步长是 sizeof(int),通常是4字节 ``` ### 四、指针与数组的关系 数组名在大多数情况下会被视为指向数组第一个元素的指针。数组和指针可以互换使用,但数组名是常量指针,不能进行赋值。 ```c int arr[] = {1, 2, 3}; int *p = arr; for(int i = 0; i < 3; i++) { printf("%d ", *(p + i)); } ``` ### 五、指针与函数 指针可以作为函数参数,实现对实参的修改;也可以作为函数返回值,返回一个地址。 ```c void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int x = 5, y = 10; swap(&x, &y); printf("x = %d, y = %d\n", x, y); // 输出 x = 10, y = 5 return 0; } ``` ### 六、指针与动态内存分配 使用 `malloc`、`calloc`、`realloc` 和 `free` 可以在堆上动态分配内存,返回的是一个指针。 ```c int *arr = (int *)malloc(5 * sizeof(int)); if(arr != NULL) { for(int i = 0; i < 5; i++) { arr[i] = i + 1; } free(arr); // 释放内存 } ``` ### 七、野指针与空指针 - **野指针**:指向不确定地址的指针,未初始化或指向已被释放的内存。 - **空指针**:值为 NULL 的指针,表示不指向任何地方。 ```c int *p = NULL; // 空指针 int *q; // 野指针 ``` 使用前应始终检查指针是否为 NULL。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值