Chap 9:指针

96、CHAP:实现高效基于硬件的多重哈希方案 本文介绍了一种高效的基于硬件的多重哈希方案CHAP,用于优化IP路由表的查找过程。CHAP通过基于内容的哈希探测(Content-Based Hash Probing)减少哈希冲突和溢出,并支持高效的插入、更新和删除操作,满足最长前缀匹配(LPM)的要求。文章详细描述了CHAP的设置算法、前缀映射策略、搜索机制以及增量更新方法,并通过实验对比分析了CHAP与传统多重哈希(MH)在溢出率和平均搜索时间方面的性能差异。实验结果表明,CHAP在高负载情况下具有更优的性能表现。 阅读详情

9.1 指针概念

预备知识

1 内存

总线:地址线(64M=26根) 数据线(32根) 控制线(读写)

地址:最小单位(0地址-0字节,1地址-1字节) 对齐(指令是按4字节对齐的)

2 指令

访存指令: 可以读写内存,用2个寄存器,一个存地址,一个放数据

LDR r0, [r1]	// mem(r1) -> data(r0)
STR r0, [r1]	// data(r0) -> mem(r1)

怎么区分内存里面的数据和指令?

PC 程序计数器,一般初值为0,指向第一条指令
除非碰到跳转指令,否则通常情况下,pc = pc + 4	

3 变量

变量的本质是什么? 变量是C语言出现之后才有的

2个属性:变量名 int a = 100; 变量值 a + 2;

变量的本质是:在C语言中,由C编译器分配的,表示内存地址和存储单元内容的一种联系。

4 指针变量

指针的本质是什么? 指针也是一种变量,但这个变量值它就是内存地址。

0xbfxxxxxx 函数栈内,局部变量

0x8048xxx 数据段,全局变量

9.2 指针用法

1 指针变量定义:

int * p;

2 指针变量赋值:

p = &a;		// good
p = 0x8048xxx;	// no error, not good.

补充: int * p = &a; 应该看待为 int* p; 同时 p = &a; 而不是 p = &a;

3 指针变量使用:

*p = 200;	// 赋值
printf("%d", *p);	// 读内容 
p--;		// 指针调整

4 指针变量类型:

char * p;
short * p;
int * p;
指针变量的类型,决定了用 *p 去访问内存时候的读取的字节数

5 易混淆的错误

1) &a 的用法

&a 是一个常量(由编译器决定),代表内存地址
&a 是一个32位整型,与a是什么类型无关
&a = 100; 	试图修改a的地址,这样的用法是错误的

2) p 的用法

int * p;
*p = 1;		// wrong!
p = 1;		// no error
给指针本身赋值p=1是允许,但如果用指针取内容 *p=1 这是有风险的,会出段错误。

6 指针的重要用法-传参

用于获取用户输入

int a;
scanf("%d", &a);

int * p = &a;
scanf("%d", p);

用于交换 swap 函数

void swap(int * a, int * b);
// 可以用于修改上一级主调函数内部的变量的值

也可以通过传指针来获取多于1个以上的返回值

void decompose(double x, long * int_part, double * frac_part);

课堂练习: 请使用 char * 指针,对一个整型数 a = 0x12345678 修改为大端存储 提示: void swap(char * p1, char * p2);

7 指针的重要用法-const保护

int main(int argc, const char * argv[]);
int printf(const char * format, ...);
int scanf(const char * format, ...);
char * strcpy(char * dst, const char * src);

const int * p;	// const 修饰 *p
*p = 100;	// error
*(p+1) = 100;	// next pos is error too
a = *p;		// ok
p++;		// ok

对比学习 const 的另一种用法

int * const p;	// const 修饰 p
*p = 100;	// ok
a = *p;		// ok
p++;		// error

8 指针的重要用法-用作返回值

用传入的指针作为函数返回的指针,这是允许的。

重要结论: 如果是函数内部局部变量的地址作为指针返回,这是有风险的。(编译没错,但不好)

9.3 指针和数组

1 指针的算术运算

1) 加一个整数 p+1 	(地址的增加值取决于指针的类型,整型指针则加4)
2) 减一个整数 p-1	(地址的减少值取决于指针的类型,整型指针则减4)
3) 两个指针相减	p1-p2	(结果是两个指针之间的元素个数,而不是字节数)
	只有相同类型的指针才能作减法,不同类型不能相减,编译器会报error
4) 自增加 p++, ++p
5) 自减少 p--, --p
6) 指针的比较	(p1 > p2)

2 特殊类型指针 void * p

void * p = &a;	// ok
p = 100;	// ok
a = *p;		// error
*p = b;		// error
p+1 (整数加1)	// ok
p++/++p	(加1)	// ok
void * malloc(size_t);

3 指针名和数组名

int a[10];
int * p = a;
有何异同?
	a[0]	vs	p[0]	=> 相同的
	*p	vs 	*a	=> 相同的
	*(p+1)	vs 	*(a+1)	=> 相同的
	p+1	vs	a+1	=> 相同的

	p++	vs 	a++	=> 不同的(数组名是一个常量,不能修改)

4 指针和二维数组

int a[5][6];
int * p = &a[0][0];
int * p = a;
int * p = a[0];
int * p = a[2];

课堂作业: 请用指针实现对一个数组的调整,要求奇数在左边,偶数在右边。 要求: 尽可能不占用额外的存储空间。

编程方法

最重要的就是分解(设计好的函数),更重要的,在于设计程序时,从何种角度考虑解法?

判定标准:
1) 逻辑简单 (嵌套少一些)
	能用1个while,就不用2个
	能不用else,就不用
	while, if, for 之间的递进逻辑少
	代码行数来作为参考

2) 学会设计函数
	原则上,能够复用的函数是好的设计,能多次复用最好
	函数的功能最好少一些,一个函数只完成一个单一功能
	函数内部除了调试语句打印外,最好不打印

3) 数据驱动编程
	《Unix 编程艺术》 -> Data Drive
	精心考虑所谓算法处理过程中要发生变化的数据是什么,以及何种条件下变化?

5 动态内存分配 allocate

堆heap 和 栈stack 的概念

&a = 0xbf9cb86c 	栈空间 3G 向下

p = 0x8129008 		堆空间 向上

&b = 0x804a018 		数据段(全局变量)跟着代码段
main = 0x8048414 	代码段最小

常用函数

void * malloc(size_t size);
void free(void * ptr);

void * calloc(size_t nmemb, size_t size);	
void realloc(void * ptr, size_t size);

void * alloca(size_t size);

步进电机选型避雷手册:为什么你的42HS电机总丢步?从相数、电流到散热全面拆解 本文深入剖析了42HS步进电机在高速或重载下易出现丢步问题的根本原因。文章指出,选型时不应仅关注静态保持转矩,而需重点分析动态矩频曲线、合理匹配驱动器电流与细分数、进行准确的机械传动惯量计算,并有效管理系统共振与散热。通过全面拆解这些关键因素,为工程师提供了实用的选型避雷指南与系统优化方案。 阅读详情

相关推荐

【硬件自锁开关】用两个D触发器完成实用的自锁开关电路

性价比是做电子设计的人要考虑的事,在学会了用单片机解决大多数问题的时候,是否你也想过用简单的手段解决一个多数场合要解决的问题呢?按一下,输出状态由关闭变成开启,再按一下开启变成关闭。机械弹簧式的开关可以实现自锁的功能:钩子和弹簧将当前状态“储存”起来,这个能量为下一次触发的提供状态“翻转”的动力;在电子设计中,经常通过单片机的程序指令实现自锁:通过寄存器将当前电平状态暂存起来,下一次触发的时候寄存器内容“取反”,再将其输出到端口。可否用电路实现以上过程呢?完全可以,方案很简单,通过两个D触发器即可实现。

qq_33175704的博客 4268

chap08:指针

本章介绍了指针的作用、定义和使用。

ahBingo的博客 1172

JS+H5打字练习器

实现功能 1.导入.TXT文件到打字练习内容(部分浏览器可能出于安全问题限制了这一步操作) 2.输入文本到打字练习内(弹出输入框,将要练习的内容输入至输入框) 3. 开始练习,并根据正误在打字练习内容文本上修改颜色(某个字正确显示绿色,某个字错误,显示红色,某个字没有打显示灰色) 4.开始练习、结束练习,全部输入完成后自动结束练习,也可提前手动结束练习,结束练习后弹窗用显示时和正确率。(区别在于一个全部输入完成且全部正确,一个提前结束无其他条件) 效果图 分析 HTML 结构解析 根元素:<!DO

w11111xxxl的博客 1414

C语言 | chap6 指针

C语言指针

weixin_45965919的博客 135

时序数据库避坑指南:TDengine与IoTDB在车联网场景的7个关键对比

本文对比了时序数据库TDengine与IoTDB在车联网场景下的7个关键差异,包括数据模型设计、边缘-云端协同能力、车规级函数库、存储压缩算法等。通过真实案例和性能测试,帮助企业在新能源汽车大数据处理中选择合适的时序数据库,优化存储成本和实时告警性能。

rust6ferris的博客 453

神经元细胞结构刨析(持续更新)

神经细胞的学习笔记

weixin_46596227的博客 2221

CHAP5

代码 1 m = &count; 代码 2 q = *m; 代码 3 #include <stdio.h> int main(void) { int x = 99; int *p1, *p2;//定义指针变量 ...

chuidengshi7954的博客 178

MFC C++ 中实现跨平台(WindowsLinux)的远程桌面控制

**输入捕获**:在显示窗口中捕获鼠标/键盘事件(重写 `OnLButtonDown`、`OnMouseMove`、`OnKeyDown` 等),将事件坐标/键值通过网络发送到服务端。- **显示窗口**:使用 `CStatic` 或自定义 `CWnd` 派生类显示远程桌面图像(通过 `StretchDIBits` 绘制解压后的像素数据)。// 转换为相对坐标。- **Wayland 支持**:需使用 `libweston` 或 `xdg-desktop-portal`,较复杂,建议优先支持 X11。

寒寒豆豆软件公司的博客 155

Note of Chap9

Note of Chap9:  异常处理 硬件问题,资源耗尽,错误输入及程序代码编写不严谨产生异常,编译没有问题,但程序中断而不能继续运行。 eg: 字符串未被实例化,只有Null值,此时若使用其方法,将抛出空指针异常。 Throwable : Error(无法处理) , Exception Exception : RuntimeException(系统自己处理) , IOExcep

Shinetien21_专栏 539

python实现下载和离线安装包环境

导出当前电脑python安装的所有包列表requirement.txt。

m0_60352504的博客 1676

STM32实战开发(150):基于STM32的智能电力负荷控制系统开发

本文介绍了基于STM32的智能电力负荷控制系统的设计与实现,涵盖了硬件设计、软件设计、负荷预测与控制等多个方面。该系统能够实时监控电力负荷,预测未来负荷变化,并根据预测结果自动调节电力负荷,防止电网过载或浪费。未来,我们可以进一步优化该系统,加入更多的传感器数据,提升预测算法的精度,并结合大数据与云计算技术实现更为强大的远程控制与数据分析功能。

2201_76125393的博客 715

CHAP4

代码 1 double balance[100]; 代码 2 balance[3] = 12.23; 代码 3 char p[10]; 代码 4数组 #include <stdio.h> int main(void) { in...

chuidengshi7954的博客 136

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

think in c 完结(chap3,4,5 函数 9.结构体)

文章目录think in c结合Coursera北大视频完结函数(书中chap3,4,5)指针(书中chap9简单带过)结构体(书中chap9) think in c结合Coursera北大视频完结 函数(书中chap3,4,5) 自定义头文件包含的函数调用,在导入时用双引号"“导入,而不是尖括号<>导入.因为默认的搜索路径会不同.尖括号会默认搜索系统库.用双引号”"就会优先搜索当前...

www.iqer.info 534

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

CHAP2

代码 1 int i,j,l; short int si; unsigned int ui; double balance, profit, loss; 代码 2 void func1(void) { int x; x = 10; } void f...

chuidengshi7954的博客 159

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

chap09:结构体、枚举与共用体

本章简单介绍了结构体、枚举和共用体三种自定义类型的定义与使用。

ahBingo的博客 930

C++Primer 5th Chap9 Sequential Container

vector 可变大小数组,支持快速随机访问(在除了尾部之外部分插入删除元素很慢) deque 双端队列,支持快速随机访问(在头尾插入删除元素很快) list 双向链表,仅支持双向顺序访问(在任何位置插入删除元素都很快) forward_list 单向链表,仅支持单向顺序访问(在任何位置插入删除元素都很快) array ...

auj35902的博客 170

【C++程序设计基础】Chap9虚函数与多态性笔记

C++程序设计基础第九章虚函数与多态性笔记

m0_68738986的博客 194

C++ Primer 5th笔记(chap 12 动态内存)智能指针概述

•对象的生存期 内存类型 定义 分配和销毁时机 全局对象 程序启动时分配,程序结束时销毁 静态内存 局部static对象类static数据成员 第一次使用时分配,程序结束时销毁 栈内存 定义在函数内的非static对象局部自动对象 进入块时分配,离开块时销毁 动态内存 定义在任何函数之外的变量 程序用堆来存储动态分配的对象显式创建,显式销毁 1. new 创建内存对象, delete删除内存对象 //直接初始化方式来初始化一个动态分配的对象 int *pi = new i

thefist的专栏 424

C语言最重要的知识点(chap6)

第六章 指针变量的本质是用来放地址,而一般的变量是放数值的。 1.int *p中,*p和p的区别:简单说,*p是数值,p是地址! *p可以当做变量来用:*的作用是取后面地址p里面的数值 p可以当做地址来用:可以用在scanf函数中:scanf("%d",p); 2.*p++和(*p)++之间的区别:改错题重点,考试超级重点 *p++是地址,会变化。口诀:取当前值,然后再移动地址! (*p)++是数值,会变化。口诀:取当前值,然后再使数值增加1。 例题:请问 *p++和(*p)++的数值分别为多少? int

亚洲彳亍女的博客 579

chap 18:JNI在多线程中的应用

引文地址:http://blog.youkuaiyun.com/hust_liuX/archive/2006/12/25/1460486.aspx 我在这里将文章整理了一下,重新修改了部分描述和增加了一些重要的说明事项。修改文如下: 问题描述: 一个java对象通过JNI调用DLL中一个send()函数向服务器发送消息,不等服务器消息到来就立即返回,同时把JNI接口的指针JNIEnv *env(虚拟

zvivi521的专栏 628

c语言中 指针是一个,指针是C语言中的一个概念.

指针是C语言中的一个概念.Tag内容描述:1、第十章 指针,指针是C语言中的一个概念,正确而灵活地运用指针,可以有效地表示复杂的数据结构、难动态分配内存、方便使用字符串和数组、能使函数返回一个以上的结果、能直接使用内存地址等。,本章内容包括: 10.1 地址和指针的概念 10.2 变量的指针和指向变量的指针变量 10.3 数组与指针10.4 字符串与指针 10.5 指向函数的指针 10.6 返回指...

weixin_42309866的博客 276

Cxx primer-chap9-Sequential Containers

【代码】Cxx primer-chap9-Sequential Containers。

Ocodotial的博客 692

开讲啦:Chap 09 用户自己建立数据类型

“关注hahaCoder获取最新资讯”前言C语言允许用户根据需要自己建立数据类型,用它来定义变量。9.1 定义和使用结构体变量9.1.1 自己建立结构体类型C语言允许用户自己建立由不同...

石璞东 354

<OS Concepts 9th> Chap 3 进程管理

介绍进程的概念:执行中的程序 描述进程的特征:如调度、创建、终止 探索进程间通信:使用共享内存和消息传递 描述客户端-服务端框架下的通信

emon22的博客 309

学堂在线数据结构-chap2

第二章-作业问题 1、 Is it possible to replace:是否可以将视频里向量扩容代码中的: for (int i = 0; i < _size; i++) _elem[i] = oldElem[i]; in the vector expansion code in the video with: 替代为: memcpy(_elem, oldElem, _size * sizeof(T)); P.S.This question involves the relevant knowle

weixin_45252975的博客 1151
上一篇: 位操作/指针和数组/字符串
下一篇: Chap 10:字符串
weima007
博客等级 码龄17年 92粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值