当前位置: 首页 > news >正文

【开卷数据结构 】指针的初步认识

文章目录

  • 前言
  • 什么是指针
    • 什么是内存
    • 什么是地址
    • 存取内存单元数据的方法
      • 直接访问——按变量名存取变量的值
      • 间接访问——通过变量的地址来存取变量的值。
    • 指针变量的定义
    • 指针变量使用注意事项
  • 指针、间接访问和变量
    • 案例分析
    • 作用
  • 指针的指针
  • 练习
    • 1.字符串长度,实现strlen函数
    • 2.字符串长度,实现strlen函数

前言

说到指针,想必大家都不陌生,指针的最大特点就是难以理解,它是编程中很基础也是很重要的概念,指针可以有效的实现像树,链表这类高级的数据结构。


什么是指针

在了解指针是什么之前,我们需要先了解什么是计算机的内存,什么是地址。


什么是内存

内存:计算机内存大部分时候指的是随机存储器也就是RAM,用于存放当前正在执行的变量或程序对象。

什么是地址

地址:变量的值存储在计算机的内存中,每个变量都占据一个特定的位置。每个内存位置都由地址唯一确定并引用,就像一条街道上的房子由它们的门牌号码标识一样。通过地址才可以找到内存中的变量。


当我们声明一个整型类型的变量 i 时,计算机会为这个特定的变量分配一定的空间,具体分配多少空间取决于数据类型


存取内存单元数据的方法

存取内存中单元数据一般有两种方法,第一种是直接访问,第二种是间接访问。

直接访问——按变量名存取变量的值

例如:

	int x;
	x = 10;
	printf("%d",x);

间接访问——通过变量的地址来存取变量的值。

这一方法也称为「 指针访问 」,实现这一方法有两个问题需要我们解决。

Q: 如何得到变量的地址?如何取得该地址下的数据呢?

为了解决这一问题,我们需要认识两种运算符。

“ & ” —— 取地址运算符。地址为一个16进制的整数。%d(10进制)或 %x(16进制)

“ * ” —— 间接访问运算符。作用:返回该地址所指向存储单元的数据。

通过这两种运算符我们就能实现间接访问了。


指针变量的定义

指针变量的定义形式如: 数据类型 * 指针名

//分别定义了 int、float、char 类型的指针变量
int *x;
float *f;
char *ch;

指针变量使用注意事项

(1)指针变量中只能存放地址

//非法赋值
int *p;   p = 2001;       

(2)不能对未赋值的指针变量进行 “ * ” 运算

 //非法赋值
int *p;   *p = 10;       

指针、间接访问和变量

案例分析

我们来看看下面这个式子是什么意思。

*&a = 15;   
思考一下,先别看答案

正确答案就是将值25赋给变量a。我们来分析一下这个式子。

首先,通过取地址运算符 & 产生变量 a 的地址,他是一个指针常量。

然后间接访问运算符 * 访问其操作数所表示的地址。在这个表达式中,操作数是 a 的地址,所以就把值 25 储存在 a 中。

作用

这条语句与a = 25有什么区别吗?
从功能上讲,确实没有什么区别;从性能上讲,前者又大又慢;从可读性来讲,前者看起来很恶心。因此,一般没有人用*&a这样的表达式 ,除非你想整活

指针的指针

来个例子
int a = 10;
int *b = &a;
int c = &b;

很明显,变量b是一个指向整形a的指针,那么变量c是什么呢?

变量c是指向b类型的指针,也就是指向“指向整型的指针”的指针,通俗来讲,就是指向指针的指针。
我们也可以用int **c = &b;来声明变量。

内存中具体形状

我们可以一直这样套娃下去。比如我们想要声明一个指向指针的指针的指针 ,就可以用int ***p = c

表达式相等的表达式
a10
b&a
*ba, 12
c&b
*cb, &a
**c*b, a, 10

练习

1.字符串长度,实现strlen函数

int StringLen (char *s)
{
	int n = 0;
	char *p = s;
	while( *p != '\0' )   
	{  
		n++; 
		p++; 
	}
	return n;
}

2.字符串长度,实现strlen函数

void CopyString(char *s1,char *s2)
{
	char *p1,*p2;
	for(p1 =s 1,p2 = s2; *p2 != '\0'; p1++,p2++)
	{
		*p1 = *p2;  
	}
	*p1 = '\0';
}

相关文章:

  • Python高级_第3章_HTTP协议与静态Web服务器开发
  • 创造一个表格编辑距离指标
  • 大数据Hadoop之——Apache Hudi 数据湖实战操作(FlinkCDC)
  • ikun网站成名录: HTML 中的常用标签用法,从0到1创建一个ikun简介
  • <Linux系统复习>文件描述符
  • 【C++入门】(纯)虚函数和多态、抽象类、接口
  • 推荐一个C#开发的窗口扩展菜单,支持系统所以窗口
  • 初识深度学习-吴恩达
  • Rust Tauri OpenCV 写一个桌面摄像头
  • 在python中使用ggplot2
  • 基于 Vue 和 SpringBoot 实现的博客系统(附源码)
  • 【MySQL高级篇】数据库到底是什么?一文带你快速上手MySQL
  • Python所有的库都在这里了!!强烈建议收藏
  • 一文彻底搞懂Mybatis系列(十二)之MyBatis多对一映射延迟加载(association和lazyLoadingEnabled)
  • 贝叶斯推理三种方法:MCMC 、HMC和SBI
  • CEF与代理
  • Docker入门(二) - Dockerfile
  • java2019面试题北京
  • miaov-React 最佳入门
  • Mocha测试初探
  • nodejs实现webservice问题总结
  • react-native 安卓真机环境搭建
  • SQLServer之索引简介
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • uni-app项目数字滚动
  • 初识 webpack
  • 前端路由实现-history
  • 如何在GitHub上创建个人博客
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 1.Ext JS 建立web开发工程
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • #include到底该写在哪
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Java)【深基9.例1】选举学生会
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (十) 初识 Docker file
  • (四)图像的%2线性拉伸
  • (转)菜鸟学数据库(三)——存储过程
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .gitignore文件_Git:.gitignore
  • .Net 4.0并行库实用性演练
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net 怎么循环得到数组里的值_关于js数组
  • .net6Api后台+uniapp导出Excel
  • .Net中的集合