历史上的今天
今天是:2025年06月16日(星期一)
2021年06月16日 | Keil c51指针变量
2021-06-16 来源:eefocus
单片机c语言支持一般指针(Generic Pointer)和存储器指针(Memory_Specific Pointer)。
1. 1. 一般指针
一般指针的声明和使用均与标准C相同,不过同时还能说明指针的存储类型,例如:
long * state;为一个指向long型整数的指针,而state本身则依存储模式存放。
char * xdata ptr;ptr为一个指向char数据的指针,而ptr本身放于外部RAM区,以上的long,char等指针指向的数据可存放于任何存储器中。
一般指针本身用3个字节存放,分别为存储器类型,高位偏移,低位偏移量。
2. 2. 存储器指针
基于存储器的指针说明时即指定了存贮类型,例如:
char data * str;str指向data区中char型数据
int xdata * pow; pow指向外部RAM的int型整数。
这种指针存放时,只需一个字节或2个字节就够了,因为只需存放偏移量。
3. 3. 指针转换
即指针在上两种类型之间转化:
l 当基于存储器的指针作为一个实参传递给需要一般指针的函数时,指针自动转化。
l 如果不说明外部函数原形,基于存储器的指针自动转化为一般指针,导致错误,因而请用“#include”说明所有函数原形。
l 能强行改变指针类型。
变量的存储类别
一、static(静态局部)变量。
1、静态局部变量在程序整个运行期间都不会释放内存。
2、对于静态局部变量,是在编译的时候赋初值的,即只赋值一次。如果在程序运行时已经有初值,则以后每次调用的时候不再重新赋值。
3、如果定义局部变量的时候不赋值,则编译的时候自动赋值为0。而对于自动变量而言,定义的时候不赋值,则是一个不确定的值。
4、虽然静态变量在函数调用结束后仍然存在,但是其他函数不能引用。
二、用extern声明外部变量。
用extern声明外部变量,是为了扩展外部变量的作用范围。比如一个程序能由多个源程序文件组成。如果一个程序中需要引用另外一个文件中已经定义的外部变量,就需要使用extern来声明。
正确的做法是在一个文件中定义外部变量,而在另外一个文件中使用extern对该变量作外部变量声明。
一个文件中: int abc;
另外一个文件中: extern abc;
例子:
用extern将外部变量的作用域扩展到其他文件:
文件1:
//用extern将外部变量的作用域扩展到其他文件中
#include
#include
#include
unsigned int array[10];
void fillarray();
void init_ser()
{
SCON=0X50;
TMOD|=0X20;
TH1=0XF3;
TR1=1;
TI=1;
}
void main()
{
unsigned int i;
init_ser();
fillarray();
for(i=0;i《10;i++)
{
printf(“array[%d]=%dn”,i,array[i]);
}
for(;;){;}
}
文件2:
extern int array[10];
void fillarray()
{
unsigned char i;
for(i=0;i《10;i++)
{
array[i]=i;
}
}
在单片机c语言中变量的空间分配几个方法
1、 data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。
2、 data区内最好放局部变量。
因为局部变量的空间是能覆盖的某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),能提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;
3、 确保你的程序中没有未调用的函数。
在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil C做得很愚蠢,但也没办法。
4、 程序中遇到的逻辑标志变量能定义到bdata中,能大大降低内存占用空间。
在51系列芯片中有16个字节位寻址区bdata,其中能定义8*16=128个逻辑变量。定义方法是: bdata bit LedState;但位类型不能用在数组和结构体中。
5、 其他不频繁用到和对运算速度要求不高的变量都放到xdata区。
6、 如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。
7、 当使用到指针时,要指定指针指向的内存类型。
在单片机c51语言中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为: char data *p;。还可指定指针本身的存放内存类型,如:char data * xdata p;。其含义是指针p指向data区变量,而其本身存放在xdata区。
上一篇:51单片机定时器实验
下一篇:关于51单片机晶振的21个问题
史海拾趣
|
摘 要: 报道了一个具有低噪声性能的2~26GHzGaAs超宽带单片功率放大器的研究结果,介绍了模型提取!电路设计和单片制作的全过程.放大器采用分布式设计,在超宽带频率范围内增益为615?015dB,输入输出驻波比小于210.在2~20GHz内测得输出功率大于30 ...… 查看全部问答> |
|
请进我的博客日志看:https://home.eeworld.com.cn/index.php?uid-77246-action-viewspace-itemid-13210… 查看全部问答> |
|
此电路是将自整角机的三线信号转换为AD2S83可接受的2V sin以及cos信号的电路,上面的一路为参考电压输入 请问这里面二极管的作用,选择的二极管应该是稳压二极管吗?还是普通二极管,应该选择什么样的型号?… 查看全部问答> |
|
ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序 ...… 查看全部问答> |
|
用的是sharp5.7的屏 320*240分辨率 字库是16*8的 在uboot里添加了对LCD的驱动 而且上电后可以看到LOGO 显示正常 但是LOGO下方的输出信息字符错位 例如:字符B->B的两个竖杠会往右偏移 而B的上中下横杠是位置不变的 &nbs ...… 查看全部问答> |
|
platform builder sysgen时的错误 LNK1123 大家好,我使用platformbuilder进行编译 厂家给的操作系统 然后是成功的,但是它里面只有一个arm的cpu 我又增加了模拟器的cpu并且切换过去进行sysgen,结果就报错了 报错的内容如下 G:\\mytest\\wince_form_utu_2440\\WINCE5.0_Proj\\WINCE500\ ...… 查看全部问答> |
|
最近写一段小代码,发现了一个问题,我的QUARTUSII9.0下运行的。 我写了一个多人表决器的底层模块,在写VHDL代码时,在结构体里面定义了一个sinal量,名称为data,它是一个含有3位的矢量。 它的值等于外部接口A,B,C三个组成的矢量,即data<=C& ...… 查看全部问答> |




