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 ...
随机推荐
- 打造基于Ubuntu+XBMC的家庭媒体中心
作为一名高清爱好者,一直想配置一台HTPC放家里实现高清播放外加家庭服务器功能.Nvidia的Ion平台自然是高清平台的硬件首选,而家庭媒体中心的软件端则首先考虑开发的已经很成熟的开源利器 XBMC ...
- Java深度理解——Java字节代码的操纵
导读:Java作为业界应用最为广泛的语言之一,深得众多软件厂商和开发者的推崇,更是被包括Oracle在内的众多JCP成员积极地推动发展.但是对于 Java语言的深度理解和运用,毕竟是很少会有人涉及的话 ...
- ubuntu166.04之Caffe安装
写在前面:之前一直在搞keras,最近由于某些需求,需要学习caffe,在此记录caffe的安装记录.默认已经安装了cuda 如果是从其他的深度学习平台迁移到Caffe,那么按照这个教程来就可以了. ...
- Android设备管理器 DevicePolicyManager
设备管理器有个特点,你注册了之后如果不解除注册就会难以卸载带有设备管理器的应用,目前4.3版本仍未提示用户如何卸载,maybe later. 在「设定-安全」你可以看见「设备管理器」,它提供一些高级功 ...
- nginx开发_ngx_http_script源码解析
功能简介 nginx中有很多配置项支持以变量的形式存在,在运行时根据实时值进行处理.例如如下配置: location / { sub_filter '<a href="http://1 ...
- js some和filter用法和区别
some方法 array1.some(callbackfn[, thisArg]) 对数组array1中的每个元素调用回调函数callbackfn,当回调函数返回true或者遍历完所有数组后,some ...
- bzoj 1014 [JSOI2008]火星人prefix——splay+哈希
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1014 用splay维护字符串,每个点记录子树的哈希值,然后二分查询. 二分不是把两个点的哈希 ...
- ajax展示新页面同时传递参数
HTML页面部分代码: <div id="course" hidden></div> HTML页面中ajax代码: var selectType=$(&qu ...
- dubbo项目中包的依赖说明
依赖 (+) (#) 必需依赖 JDK1.5+ 理论上Dubbo可以只依赖JDK,不依赖于任何三方库运行,只需配置使用JDK相关实现策略. 缺省依赖 通过mvn dependency:tree > ...
- Levko and Array
题意: 有一长度为n的正整数序列,你可以选择K个数字任意改变它,使得$max \{ a(i+1) - a(i) \} $ 最小,求最小值. 解法: 1.$O(n^2log(MAX_A) )$,考虑二分 ...