深入理解C语言指针

news2024/11/27 16:50:01

目录

一、指针基础知识 

二、野指针

三、指针运算

四、二级指针

五、指针数组与数组指针

六、函数指针与函数指针数组


一、指针基础知识 

什么是指针?   

指针其实就是个用来存放地址的变量,定义为type + *。

指针大小?

32位平台(32个地址线)是4字节,64位平台(64个地址线)是8字节。

指针类型有哪些?

我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?有的。
指针的定义方式是: type + * 。 其实: char* 类型的指针是为了存放 char 类型变量的地址。 short* 类型的指针是为了存放 short 类型变量的地址。 int* 类型的指针是为了存放 int 类型变量的地址。

二、野指针

概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
几种常见野指针:
(1)指针定义时为未初始化
int main(){
    int* p;
    *p = 2;  //解引用时会出现野指针问题
    return 0;
}

(2)指针使用已经释放的空间

int mian(){
    int *p = (int*)malloc(sizeof(int));
    free(p);
    *p = 2;  //误用已经释放的内存,造成野指针问题
    return 0;
}

(3)指针越界访问

int main()
{
    int arr[10] = {0};
    int *p = arr;
    int i = 0;
    for(i=0; i<=11; i++)
    {
        //当指针指向的范围超出数组arr的范围时,p就是野指针
        *(p++) = i;
    }
    return 0;
}

如何规避野指针?

  1. 指针定义时进行初始化
  2. 小心指针越界
  3. 指针释放空间是置NULL
  4. 指针使用前检查其有效性

三、指针运算

我们先来看下指针和数组之间的关系。

数组名是什么?我们来看一个例子

#include <stdio.h>
int main()
{
    int arr[10] = {0,1,2,3,4,5,6,7,8,9};
    printf("%p\n", arr);
    printf("%p\n", &arr[0]);
    return 0;
}

可见数组名和数组首元素的地址是一样的。 结论:数组名表示的是数组首元素的地址
故int*p = arr 是可行的

(1)指针 +- 整数

int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
int*p = arr;
p++;

        在上面代码中指针p类型是int*类型,对p++实际是将指针p+sizeof(int)字节。++前p的值为数组第一个元素0,++后p的值为数组第二个元素1,故我们除了用下标访问的形式访问数组中的数据外也可通过这种方式来访问数组内的数据,如下:

int main(){
    int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
	int* p = arr;
	for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
		printf("%d ", *(p + i));
	}
    return 0;
}

(2)指针 - 指针

指针 - 指针即代表两指针相隔几个元素,如下:

int main(){
    int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
    int* p1 = arr;
	int* p2 = &arr[4];
	printf("%d ", p2 - p1); 
    return 0;
}

四、二级指针

int main(){
    int a = 10;
	int* pa = &a;
	int** ppa = &pa;  //二级指针
    return 0; 
}

下面通过监视来更好理解二级指针:

 

从图中我们可以看出一级指针中存储的是变量的地址,二级指针存储的是一级指针的地址。更高级的指针同理。

想通过ppa找到变量a的值需要对其进行两次解引用操作,因*ppa是pa的值,pa中存储的是a的地址,故**ppa才是a的值。

五、指针数组与数组指针

不知道大家是否和我一样指针数组和数组指针在学的时候还是有点混淆的,下面来详细看一看。

指针数组:本质就是个数组,数组中元素类型是指针类型

定义:int *p [5]

元素类型:p首先和[ ]结合构成数组,我们只需要把他去掉之后就是它的元素类型。

 

数组指针:本质就是个指针,指针指向数组

定义:int (*p) [5]

元素类型:p首先和 () 结合构成指针,同样把他本身去掉之后就是它的元素类型。

说明:[ ]优先级要高于*号,当不加 () 时会首先和[ ]结合,反之会首先和*结合

理解:

 

六、函数指针与函数指针数组

函数指针:本质就是个指针,指针指向一个函数

定义:void (*pf) (int, int)

解释:和前面分析一样很容易知道,pf是一个指针指向返回值void类型,形参为均int类型的函数。

函数指针数组:本质就是个数组,数组中元素类型为函数指针

定义:void (*pf[5]) (int, int)

解释:pf为数组,数组中存储的元素类型为函数指针类型,返回值为void类型,形参均为int类型

理解:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/513148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【大数据-调度工具】dolphinscheduler安装和遇到的问题

1.安装 安装步骤按照官网安装即可 官网&#xff1a;DolphinScheduler | 文档中心 (apache.org) 版本&#xff1a;3.1.5 2.踩坑记录 Q1.大文件无法上传 问题描述&#xff1a; 在资源中心中上传文件选择完大文件夹之后&#xff0c;选择确认之后确认按钮转了几圈圈之后就没…

[Element]调整select样式

通过伪元素&#xff0c;实现这个和step长得差不多的样式 <template><el-selectv-model"value"placeholder"请选择提报单位"style"width: 430px"><el-optionv-for"(item, i) in officeList":class"el-option get…

hive的基本操作语句

背景&#xff1a;记录一下hive创建数据库&#xff0c;建表&#xff0c;添加数据&#xff0c;创建分区等的语句吧&#xff0c;省得总百度&#xff0c;&#x1f604; 第一步&#xff1a;hive的建库语句 create database pdata_dynamic;查看是否创建成功了 show databases;显示如…

Jenkins入门教程

一、开始使用 Jenkins 本导读将向您介绍使用 Jenkins、Jenkins 的主要特性和 Jenkins Pipeline 的基本知识。 本导读使用“独立”的 Jenkins 发行版&#xff0c;它可以在您自己本地的机器上运行。 准备工作 第一次使用 Jenkins&#xff0c;您需要&#xff1a; 机器要求&…

从入门到实践:计算机视觉图像分类完全指南

计算机视觉图像分类是计算机视觉领域的一个重要分支&#xff0c;它的目标是让计算机能够识别并分类不同的图像。在本文中&#xff0c;我们将介绍计算机视觉图像分类的基本概念、流程和常用算法。 一、图像分类的基本概念 图像分类是指将输入的图像自动分类到预定义的一组类别中…

量子计算+真实材料模拟!美国埃姆斯国家实验室科学家获得新突破

​ 噪声量子比特ADAPT仿真&#xff08;图片来源&#xff1a;网络&#xff09; 量子计算机的潜在功能远远超出当今的经典计算机&#xff0c;来自美国能源部埃姆斯国家实验室的科学家们展示了一种在材料研究中利用量子计算的新方法&#xff0c;通过模拟材料的自适应算法&#xf…

自参考和对比学习正则化的Few-shot医学图像分割

文章目录 Few-shot Medical Image Segmentation Regularized with Self-reference and Contrastive Learning摘要本文方法Local Prototype-Based SegmentationSelf-reference RegularizationContrastive LearningSuperpixel-Based Self-supervised Learning 实验结果 Few-shot …

分布式搜索引擎2——深入elasticsearch

数据聚合 聚合的分类 聚合(aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类: 桶(Bucket)聚合:用来对文档做分组 TermAggregation:按照文档字段值分组Date Histogram:按照日期阶梯分组&#xff0c;例如一周为一组&#xff0c;或者一月为一组 度量&…

第10章:数据处理增删改

一、插入数据 CREATE TABLE emp1 (id int(11) ,name varchar(15) ,hire_date date ,salary double(10,2) )1.添加一条数据 ①没有指明添加的字段&#xff0c;一定按照顺序添加 insert into emp1 values(1,wang,2000-4-4,5900)②指明添加的字段&#xff08;推荐&#xff09;…

【 图像水印 2019 CVPR】 StegaStamp 论文翻译

【 图像水印 2019 CVPR】 StegaStamp 论文翻译 论文题目&#xff1a;StegaStamp: Invisible Hyperlinks in Physical Photographs 中文题目&#xff1a;物理照片中不可见的超链接 论文链接&#xff1a;https://arxiv.org/abs/1904.05343 论文代码&#xff1a;https://github.co…

QxRibbon 知:openEuler 23.03 搭建 Qt5 开发环境

文章目录 安装 openEuler 23.03 虚拟机安装 GNOME 桌面环境安装 Qt5 开发环境构建 QxRibbon参考资料 安装 openEuler 23.03 虚拟机 VMware 安装 openEuler 23.03 虚拟机 平台&#xff1a;x86_64 虚拟机配置&#xff1a;4核、4G内存、100G磁盘 ISO 镜像&#xff1a;https://mir…

FT2000+ qemu kvm 红旗 crash 分析 频繁设置CPU online导致进程卡死、不调度故障

测试程序 /** tcti.cpp参考&#xff1a; https://www.cnblogs.com/organic/p/17321523.htmlg -stdc11 -lpthread trigger_cgroup_timer_inactive.cpp -o inactive_timer ./inactive_timer 100000 10000 */#include <errno.h> #include <iostream> #include <pt…

Redis进阶(集群,雪崩,击穿,穿透.......)

Redis进阶 Redis事务_事务的概念与ACID特性 Redis的事物不保证原子性 数据库层面事务 在数据库层面&#xff0c;事务是指一组操作&#xff0c;这些操作要么全都被成功执行&#xff0c;要么全都不执行。 数据库事务的四大特性 A&#xff1a;Atomic&#xff0c;原子性&#xf…

Docker笔记5 | 容器的基本操作

5 | 容器的基本操作 1 启动容器1.1 启动方式1.2 新建容器并启动1.3 docker run时的运行过程1.4 启动已终止容器1.5 后台运行1.6 查看容器信息 2 终止容器3 进入容器3.1 docker attach3.2 docker exec 4 导入导出容器4.1 导出容器4.2 导入容器 5 删除容器 1 启动容器 1.1 启动方…

Linux内核主要组成部分有哪些?

Linux 内核由几大子系统构成&#xff0c;分别为进程调度、进程间通信&#xff08;IPC&#xff09; 、内存管理、虚拟 文件系统和网络接口。这几大子系统既相互独立又有非常紧密的关联。图 3-5 展示了内核的 几大子系统之间以及这些子系统和计算机系统的其他模块之间的关系。 接…

ADS-B教学实验方案

ADS-B教学系统是为了让学生学习ADS-B原理、ADS-B系统组成、ADS-B信号处理技术。可以通过ADS-B教学系统进一步研究分析ADS-B位置的精度、准确性、稳定性、实时性&#xff0c;设计基于ADS-B的空中碰撞告警系统&#xff0c;混合空域的空中交通管理系统(UTM)设计。也可以研究ADS-B报…

《花雕学AI》你不知道的AI 机器人:29个让你大开眼界的事实

AI 机器人是人工智能技术的最具代表性的应用之一&#xff0c;它们可以模仿人类的行为和思维&#xff0c;完成各种复杂的任务&#xff0c;如识别图像、语音和文字&#xff0c;进行对话、翻译和推理&#xff0c;控制机械臂、汽车和飞机等。AI 机器人的发展速度令人惊叹&#xff0…

Windows命令提示行使用指南二(批处理)

命令提示行使用指南 前言四、批处理简介五、如何编写批处理1、Hello world2、做加法3、查找文件&#xff0c;并输出到文本。4、批量重命名5、自动记录开机时间 前言 cmd 是 Windows 操作系统中的命令行界面&#xff08;CLI&#xff09;&#xff0c;也称为命令提示符&#xff0…

Linux shell编程 数组排序算法

冒泡排序 循环对比相邻的元素&#xff0c;交换较大元素到后面的位置 大循环根据列表中存在的元素数量循环n-1次&#xff0c;保证所有元素都能被排序完成 小循环从前向后遍历&#xff0c;循环一次循环范围减少一位&#xff08;由于后面的已经排列完成无需再比较&#xff09;小循…

【halcon知识】应用仿射变换

一、说明 无论什么样的变换&#xff0c;都离不开齐次变换矩阵。一般地&#xff0c;先准备一个空的齐次变换矩阵&#xff0c;这个矩阵随便填写&#xff1a;1&#xff09;填入旋转类参数就是旋转矩阵&#xff0c;2——填入仿射参数就可进行仿射变换&#xff0c;3&#xff09;填入…