C语言指针学习
指针简介
指针与底层硬件联系紧密,使用指针可以操作数据的地址,实现数据的间接访问。
操作方式
int *p;//
定义了一个指向int型数据的指针变量
如果*号放在前面:如int *p,pi;//则说明这两个变量都为int型的指针
操作方式
取地址 p=&a; //将数据a的首地址赋值给p
取内容 *p; //取出指针所指向的数据单元
指针加 p++; //使指针的数据地址向下移动一个相应的数据单元,比如int数据向下移动一个数据单元就是4字节;
p+5; //指针的地址相加5个相应的数据单元;
指针减 p–; //指针向上移动一个相应的数据单元
p-5; //指针向上移动5个相应的数据单元;
1字节=8bit
int 为4字节
long 为4字节
float 为4字节
short 为2字节
char 为1字节
double 为8字节
指针和数组的关系
比如char c[ ]={ 0x33,0x34,0x35};
当0x33的内存首地址为0x4000;
定义char *c=0x4000;
这时
c[0]=*c
c[1]=*(c+1);
c[2]=*(c+2);
malloc函数进行对计算机内存空间进行分配
比如 :malloc(数目*字节大小)
malloc(5*4);//
分配5个4个字节的空间也就是20个字节的空间
指针所占用的数据位宽为是由系统所决定的。
比如:16位的系统占用的字节数位2
32位的系统占用的字节数位4
64位的系统占用的字节数位8
指针的应用
1.参数(数组)传递
例子:
主函数中调用寻找最小值的函数,传递给函数SZ的为hh[]数组的地址,因此如果在findmin函数中进行对数组值的修改的话,在主函数中的数值也会被更改。
如果不想传递过去的数组被更改则需要在传递的数组地址前加const
//int findmin(const int *SZ,int SL);//hh[]数组值被修改将会报错
int findmin(int *SZ,int SL);
{
int i,min;
min=SZ[0];
for(i=1;i<SL;i++)
{
if(SZ[i]<min)
min=SZ;
}
return min;
}
int main(void)
{
int hh[]={4,3,5,6,1,3};
int min;
min=findmin(hh,6);
printf("%d",min);
}
如何实现通过子函数修改主函数的数值
void ReBuild(int *num1,int *num2)
{
*num1=26;
*num2=44;
}
int main(void)
{
int number1,number2;
number1=1;
number2=2;
ReBulid(&number1,&number2);
printf("number1=%d\nnumber2=%d\n",number1,number2);
return 0;
}
输出结果:
number1=26;
number2=44;
2.传递返回值(访问封装好函数库中全局变量的数值)
比如在别人封装好的函数中
int number[88,23,42,11,323,4,3,23];
int *Getnum(void)
{
return number;//返回的为number的首地址
}
因此在主函数中便可以使用Getnum()对上边的封装好的函数中的number数组进行调用
如:
int main(void)
{
int *b;//定义*b指针
b=Getnum();//Getnum将number的首地址赋值给了b
printf("b[0]=%d,*b=%d",b[0],*b);
}
输出结果:
b[0]=88,*b=88;
3.单片机中直接访问物理地址下的数据
比如在单片机中的0xE5中存有数据
我们便可以定义一个指针
unsigne char *p;
p=(unsigned char*)0xE5;
//*p将读取0xE5中的数据;
再单片机无线数据传输数据的应用中对于发送浮点数,可以将float型通过指针转换为char型进行数据的发送,发送过去以后再通过float型进行解码从而得到相应的浮点数。
float num=45.233;
unsigned char *p;
p=(unsigend char *)#
SEND//进行发送;
float *fp;
fp=(float *)p;