code与const void*指针
关于指针:
当定义int *p时,它也会在内存中给指针变量p分配一个内存单元,假设这个单元在内存的编址为0x1003;此时,0x1003中的值是不确定的,(因为我们没有给指针赋值),当编译器遇到了p=&a时,就会在0x1003单元中保存一个地址(变量a在内存中分配的地址)
空指针:不指向任何单元,仿真野指针。在stdio.h中被定义为
- #define NULL ((void *)0)
#define NUL ’\0
NULL 使 p 指向地址 0。大多数系统中都将 0 作为不被使用的地址,所以吴用 p 也不会毁坏数据
但并非总是如此,也有系统会使用地址 0,而将 NULL 定义为其他值,所以不要把 NULL 和 0 等同起来
因为PC上有NULL的定义所以可以直接拿来使用,但是在单片机中,就没有NULL了。而且也不能简单将NULL自定义为0,因为0地址处是有用的,那么此时该怎么办呢?
空指针在概念上不同于未初始化的指针。空指针可以确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方。在函数调用时对所有的空指针进行类型转换可能是预防可变参数和无原型函数出问题的最安全的办法
注意 NULL 和 NUL 的区别:NULL表示空指针,是一个宏定义,可以在代码中直接使用。而 NUL 表示字符 '\0',也就是字符串结束标志,它是ASCII码表中的第 0 个字符。NUL 没有在C语言中定义,仅仅是对 '\0' 的称呼,不能在代码中直接使用
野指针的2种情况:
1 定义指针时没有确定的指向对象(没赋值成NULL)
2 指针p被free或者delete之后,没有置为NULL
code是KEIL C51的扩展关键字,被其修饰的变量放在ROM(硬件层面实现只读),常用来存储一个字库等常量数据表;
const是ANSI C的关键字(使用范围比keil广),被其修饰的变量理论上可以修改,但编译器会识别并报错。常用来修饰一个常量字符串或常量表。
(void *)型通用指针(无确切类型):它可以指向任何类型的变量,连续存储区的存储单元。任何类型的指针都可以通过显示类型转换变为void*型指针(即作为左值。为了获取其存储的起始地址而不获得大小),即void*是一种特别的指针,代表任何存储类型(不能判断所指对象的存储长度,所以不能引用和参与计算(不能直接进行取内容的操作.必须先转成别的类型的指针才可以把内容解释出来);常做函数的参数和返回值:此时表示入口参数或返回值可以是任何类型的指针)。指针有两个属性:指向变量/对象的地址和长度
但是指针只存储地址,长度则取决于指针的类型 。
编译器根据指针的类型从指针指向的地址向后寻址。
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
因此:
1 在51单片机中定义字库表要用到code(也可以用const CODE这样既说明存储类型有说明读写特性),查表返回表中位置要 unsigned char code *,不要code要出错因为一个是定位到IDATA中,一个在CODE中。
2 字符串或者字符型指针作为参数和返回值:作为参数时用const void*,返回值用void*
3 char *p= "hello word!",此时不能用P[2];
char str[]="hello word!",此时可以用P[2];
或者char str[]= "hello word!";char *p=str;此时可以用P[2];
code与const void*指针的更多相关文章
- void指针和const指针
void指针:主要是便于传递不同类型的参数 const指针: const char *p :const 在* 的左边表示指向一个常量指针:表示指向的内容不可变(*p不能变,p可以改变) int a = ...
- void指针意义、Const、volatile、#define、typedef、接续符
1.C语言规定只有相同类型的指针才可以相互赋值. Void*指针作为左值用于接收任意类型的指针, void*指针作为右值赋给其他指针时需要强制类型转换. 2.在C语言中Const修饰的变量是只读的,本 ...
- const 指针与指向const的指针
最近在复习C++,指针这块真的是重难点,很久了也没有去理会,今晚好好总结一下const指针,好久没有写过博客了,记录一下~ const指针的定义: const指针是指针变量的值一经初始化,就不可以改变 ...
- 你必须知道的指针基础-7.void指针与函数指针
一.不能动的“地址”—void指针 1.1 void指针初探 void *表示一个“不知道类型”的指针,也就不知道从这个指针地址开始多少字节为一个数据.和用int表示指针异曲同工,只是更明确是“指针” ...
- C语言 const与指针
//const与指针 #include<stdio.h> #include<stdlib.h> void main(){ ; ; const int *p; p = & ...
- 弄清const与指针、引用之间的关系
const和 define在常量定义上的差别 在C++中,我们可以使用const 或者 宏define来定义常量.但是C++鼓励使用const定义常量,而不是宏define.原因有很多. 1.defi ...
- (七)C语言中的void 和void 指针类型
许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和void 指针类型的使用方法及技巧. 1.首先,我们来说说void 的含义: ...
- C/C++语言void及void指针深层探索(转)
转自:http://www.lanou3g.com/blog/sort/SelfiOS/page/78 1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一 ...
- void指针(void*)用法
首先看一段测试代码: #include <stdio.h> int void_test(void* data) { ; num = *(int*)data; printf("nu ...
随机推荐
- 谈谈网站测试中的AB测试方法
什么是A/B测试? A / B测试,即你设计的页面有两个版本(A和B),A为现行的设计, B是新的设计.比较这两个版本之间你所关心的数据(转化率,业绩,跳出率等) ,最后选择效果最好的版本. A / ...
- java连接oracle的几种方式
jdbc连接(驱动包ojdbc6.jar)String driver = "oracle.jdbc.OracleDriver"; //驱动标识符 String url = &quo ...
- Android5.0 CheckBox颜色修改
Android5.0开始,CheckBox带有material design动画效果,其默认的样式如下图所示: 可以看到,在上图中,CheckBox的边框为灰色,当被选中后,填充色为绿色. 那么如果我 ...
- RequireJS 加载 js 执行顺序
初次接触RequireJS 对文档理解不很透彻,自己通过测试测到的执行顺序: 文档结构: |-amaze | -js | -amazeui.js | -jquery.min.js | -main.js ...
- 记录用到的一些linux命令和疑难解决
1. 用gedit打开.bashrc larry@larry-Rev:~$ sudo gedit ~/.bashrc 2. ubuntu里安装软件有点像iOS里的Cydia,要添加软件源来在Ubunt ...
- 【CQ18高一暑假前挑战赛3.5】标程
[A:快速幂相关] #include<bits/stdc++.h> using namespace std; int qpow(int a,int x){ a%=;; while(x){ ...
- 十、外键约束FK(foreign key)
1.定义 a.外键涉及到的术语:外键约束.外键字段.外键值. b.外键约束.外键字段.外键值三者之间的关系? 答:给某个字段添加外键约束之后,该字段称为外键字段,外键字段中的值是外键值. c.外键根据 ...
- [转]Eclipse创建Maven项目
构建Maven项目的完整过程--普通web项目(Eclipse) 进行以下步骤的前提是你已经安装好本地maven库和eclipse中的maven插件了(有的eclipse中已经集成了maven插件) ...
- JQ实现图片上传预览功能
<input type="file" name="img" id="test1"> <img src="&quo ...
- Tesseract的使用
参考:http://blog.csdn.net/qy20115549/article/details/78106569 下载tess4j的安装包. 首先,在该网站中下载tess4j的安装包. http ...