C语言指针学习

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.233unsigned char *p;
p=(unsigend char *)&num;
SEND//进行发送;

float *fp;
fp=(float *)p;
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值