C语言指针相关知识(初阶)

目录

指针是什么

指针变量的大小

指针和指针类型

指针类型的意义

野指针

指针运算

指针+-整数

指针-指针

指针的关系运算

指针和数组

二级指针

二级指针定义

指针数组

指针数组的定义


指针是什么

如下图所示(右侧编号为内存地址):

	int a = 10;//a占四个字节int* pa = &a;//拿到的是a的四个字节中第一个字节的地址//将a的地址存放在pa变量中,pa是一个指针变量

指针变量的大小


指针和指针类型

指针类型的意义

1.指针类型决定了:指针解引用的权限有多大(如下例)

	int a = 0x11223344;int* pa = &a;*pa = 0;

上述代码中,原先a地址的值在内存中显示为:

执行后面两句代码后,内存中四个字节的值被改变了:

而在下述定义char指针类型的代码中:

只改变了一个字节的地址

2.指针类型决定了:指针每走一步的步长(如下例)

	int arr[10] = {0};int* pa = arr;char* pc = arr;printf("%p\n",pa);printf("%p\n", pa+1);printf("%p\n", pc);printf("%p\n", pc+1);

同样加一,但是int类型和char类型指针的步长不同


野指针

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的) ,造成原因为:

1.指针未初始化

	int* p;//p是一个局部的指针变量,未初始化默认为随机值*p = 20;//非法访问内存

2.指针越界访问

	int arr[10] = { 0 };//数组大小为10int* p = arr;int i = 0;for (i = 0; i <= 10; i++) {//循环11次*p = i;p++;           //第11次越界,产生非法访问}

3.指针指向的空间释放

int* test() {int a = 10;return &a;
}
int main() {int* p = test();//局部变量a申请的内存空间已经销毁*p = 10;        //此时指针p再把10存入a的内存空间中,为非法访问内存return 0;
}

如何规避野指针:

1.指针初始化(不知初始化为何地址时,初始化为NULL)

2.小心越界指针

3.指针指向空间释放即放置NULL

4.指针使用之前检查有效性(if p!= NULL)


指针运算

指针+-整数

 

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = arr;int* pend = arr + 9;while (p<=pend)        //指针的关系运算(地址大小在比较){printf("%d\n", *p);//依次打印1 2 3 4 5 6 7 8 9 10p++;             //指针+-整数}

指针-指针

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };printf("%d\n", &arr[9] - &arr[0]);//结果为9//指针减去指针得到的是两个指针之间元素的个数

指针的关系运算

	#define N_VALUES 5float values[N_VALUES];float* vp;for (vp = &values[N_VALUES]; vp >&values[0];) {//关系运算*--vp = 0;//数组所有元素置为0}

上方这段代码与下方图片中的代码执行结果是相同的:

但是,下方这段代码是存在一些问题的:


指针和数组

数组名是数组首元素的地址:

	int arr[10] = { 0 };printf("%p\n", arr);//数组名是数组首元素的地址printf("%p\n", &arr[0]);//打印结果都为00EFF920

通过指针访问数组:

	int arr[10] = { 0 };int* p = arr;int i = 0;for (int i = 0; i < 10; i++) {printf("%d", *(p + i) = i);//成功打印数组各元素}


二级指针

二级指针定义

int a = 10;int* pa = &a;//pa是指针变量,一级指针//ppa是一个二级指针变量int** ppa = &pa;//pa也是个变量,&pa取出pa在内存中起始地址//a的值为10,地址为0x0012ff40//pa的值为0x0012ff40,地址为0x0012ff48//pa的值为0x0012ff48,地址为0x0012ff52

如何通过上述代码通过ppa找到a?

	 *ppa == pa*pa == a* *ppa == a

存在三级、四级等指针,但一般很少使用


指针数组

指针数组的定义

	//指针数组 - 数组int arr[10];//整型数组 - 存放整型量char ch[5];//字符数组 - 存放的是字符//指针数组 - 存放指针的数组int* parr[5];char* parr[5];

以上为C语言中指针初阶知识的相关内容,感谢您花费宝贵的时间阅读本文章!

之后博主会撰写关于指针高阶相关内容的博客。

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

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

相关文章

C++多线程学习[二]:线程的传参以及传参的一些坑

一、线程的传参 #include<iostream> #include<thread> #include<string> using namespace std; void threadtest(int a,double b,string str) {this_thread::sleep_for(100ms);cout << a << " " << b << " " &…

Overleaf Docker编译复现计划

Overleaf Docker编译复现计划 Overleaf Pro可以支持不同年份的Latex镜像自由选择编译&#xff0c;这实在是一个让人看了心痒痒的功能。但是很抱歉&#xff0c;这属于Pro付费功能。但是我研究了一下&#xff0c;发现其实和Docker编译相关的代码&#xff0c;社区版的很多代码都没…

docker部署mongo过程

1、拉取MongoDB镜像&#xff0c;这里拉取最新版本。 docker pull mongo2、运行容器 docker run -d --name mongo -p 27017:27017 \ -e MONGO_INITDB_ROOT_USERNAMEadmin \ -e MONGO_INITDB_ROOT_PASSWORD123456 \ mongo:latest --auth#由于 mongodb 默认情况下&#xff0c;…

【Linux】编写第一个小程序:进度条

文章目录 1. 预备知识1.1 简单认识几个函数1.1.1 sleep()1.1.2 fflush()1.1.3 usleep()1.1.4 memset() 1.2 缓冲区1.3 回车与换行 2. 编写入门版的进度条2.1 基本逻辑2.2 美化效果2.3 代码实现2.4 执行效果 3. 编写升级版的进度条3.1 代码实现3.2 执行效果 1. 预备知识 1.1 简…

OpenHarmony—子系统开发之内核概述

内核简介 用户最常见到并与之交互的操作系统界面&#xff0c;其实只是操作系统最外面的一层。操作系统最重要的任务&#xff0c;包括管理硬件设备&#xff0c;分配系统资源等&#xff0c;我们称之为操作系统内在最重要的核心功能。而实现这些核心功能的操作系统模块&#xff0…

【小白专用】C#关于角色权限系统

&#xff08;C#&#xff09;用户、角色、权限 https://www.cnblogs.com/huangwen/articles/638050.html 权限管理系统——数据库的设计&#xff08;一&#xff09; https://www.cnblogs.com/cmsdn/p/3371576.html 权限管理系统——菜单模块的实现&#xff08;二&#xff09; …

Java LeetCode刷题 单调栈

单调栈 单调栈概念 每日温度 单调栈 概念 单调栈&#xff08;Monotonic Stack&#xff09;是一个特殊的数据结构&#xff0c;它是一种栈&#xff0c;但具有单调性的特性。单调栈有两种类型&#xff1a;单调递增栈和单调递减栈。 在单调递增栈中&#xff0c;栈内的元素保持递…

Linux 【C编程】IO进阶— 阻塞IO、非阻塞IO、 多路复用IO、 异步IO

文章目录 1.阻塞IO与非阻塞IO1.1为什么有阻塞式&#xff1f;1.2非阻塞 2.阻塞式IO的困境3.并发IO的解决方案3.1非阻塞式IO3.2多路复用IO3.2.1什么是多路复用IO&#xff1f;3.2.1多路复用IO select原理3.2.1多路复用IO poll原理 3.3异步IO 1.阻塞IO与非阻塞IO 1.1为什么有阻塞式…

【教3妹学编程-算法题】统计出现过一次的公共字符串

3妹&#xff1a;哈哈哈哈哈哈&#xff0c;太搞笑了~ 呵呵呵呵呵呵 2哥&#xff1a;3妹干嘛呢&#xff0c; 笑的这么魔性&#xff01; 3妹&#xff1a;在看王牌对王牌&#xff0c;老搞笑了 2哥&#xff1a;这季好像没有贾玲吧。 3妹&#xff1a;是啊&#xff0c;听说贾玲去导电影…

Vue入门六(前端路由的概念与原理|Vue-router简单使用|登录跳转案例|scoped样式)

文章目录 前要&#xff1a;前端路由的概念与原理1&#xff09;什么是路由2&#xff09;SPA与前端路由3&#xff09;什么是前端路由4&#xff09;前端路由的工作方式 一、Vue-router简单使用1&#xff09;什么是vue-router2) vue-router 安装和配置的步骤① 安装 vue-router 包②…

React Native 桥接组件封装原生组件属性

自定义属性可以让组件具备更多的灵活性&#xff0c;所以有必要在JS 层通过自定义属性动态传值。 一、添加原生组件属性 因为 ViewManager 管理了整个组件的行为&#xff0c;所以要新增组件属性也需要在这里面&#xff08;如 InfoViewManager&#xff09;进行定义。 1、在Inf…

从DETR到Mask2Former(1):DETR-segmentation结构全解析

网上关于DETR做的detection的解析很多&#xff0c;但是DETR做Segmentation的几乎没有&#xff0c;本文结合DETR的论文与代码&#xff0c;对DETR做一个详细的拆解。理解DETR是理解Mask2Former的基础。 首先得把DETR-segmentation给run起来。Github上DETR的repository&#xff0…

【python入门】day26:统计字符串中出现指定字符的次数

案例 实际上if name“main”:就相当于是 Python 模拟的程序入口 。由于模块之间相互引用&#xff0c;不同模块可能都有这样的定义&#xff0c;而入口程序只能有一个&#xff0c;选中哪个入口程序取决于 ** ** name** **的值。 代码 #-*- coding:utf-8 -*- #开发时间&#xff…

SQL-分页查询and语句执行顺序

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

Pytest插件pytest-cov:优雅管理测试覆盖率

在软件开发中&#xff0c;测试覆盖率是评估测试质量的关键指标之一。为了更方便地统计和管理测试覆盖率&#xff0c;Pytest插件"pytest-cov"应运而生。本文将介绍"pytest-cov"的基本用法和优雅管理测试覆盖率的方法。 什么是pytest-cov? pytest-cov 是Pyt…

Docker数据卷与拦截与目录拦截

目录 高级容器挂载技术深度解析引言数据卷挂载原理解析应用场景使用介绍 目录挂载原理解析应用场景使用介绍 总结 高级容器挂载技术深度解析 引言 容器技术的快速发展使得容器挂载技术变得愈发重要。在容器化应用中&#xff0c;数据卷挂载和目录挂载是两种常见的挂载方式&…

【Python机器学习】SVM——调参

下面是支持向量机一个二维二分类数据集的训练结果&#xff1a; import mglearn import matplotlib.pyplot as plt from sklearn.svm import SVCplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False X,ymglearn.tools.make_handcrafted_dataset()…

ModuleNotFoundError: No module named ‘simple_knn‘

【报错】使用 AutoDL 复现 GaussianEditor 时引用 3D Gaussian Splatting 调用simple_knn 时遇到 ModuleNotFoundError: No module named ‘simple_knn‘ 报错&#xff1a; 【原因】 一开始以为是版本问题&#xff0c;于是将所有可能的版本都尝试了 (from versions: 0.1, 0.2…

笔试面试题——继承和组合

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、什么是菱形继承&#xff1f;菱形继承的问题是什么&#xff1f;二、什么是菱形虚拟继承&am…

SqlAlchemy使用教程(一) 原理与环境搭建

一、SqlAlchemy 原理及环境搭建 SqlAlchemy是1个支持连接各种不同数据库的Python库&#xff0c;提供DBAPI与ORM&#xff08;object relation mapper&#xff09;两种方式使用数据库。 DBAPI方式&#xff0c;即使用SQL方式访问数据库 ORM, 对象关系模型&#xff0c;是用 Python…