单片机学习指针2

关于指针的的问题,指针的声明和指针的指向问题。

这里主要解决自己对于上一节的问题的一个解答,正如下面的一个调试USBHID中的例子。

这里的问题是为什么HIDRxBuf时被复制量。

关于此处的理解,可以知道HIDRxBuf[128]是一个全局变量,因此HIDRxBuf在这里指的就是一个地址,是一个确定的值,而ep->xfer_buff只进行了指针的声明,并没有进行向量的赋值,因此这里是一个悬浮的指针。

ep->xfer_buff = HIDRxBuf;  //此处全局变量HIDRxbuf[]接收数据

分割线

这里引用另一个博客,为了更加深刻的理解指针http://c.biancheng.net/view/359.html

int *iPtr;                           // 声明iPtr作为一个指向int的指针

在声明中,星号(*)表示“指向的指针”。标识符“名称”被声明为一个对象,其对象类型为“类型”,也就是“指向‘类型’的指针”。类型限定符为可选择项,可能包含 const、volatile 和 restrict 的任意组合。

int 类型是 iPtr 指针所指向的对象的类型。为了让指针能够引用到给定的对象,将该对象的地址赋值给该指针。例如,如果 iVar 是一个 int 变量,那么下面的赋值操作会让 iPtr 指向变量 iVar:

iPtr = &iVar;                         // 使得iPtr指向变量iVar

分割线

这里有一个例子可以自己进行试验。

这里也对全局变量和局部变量有了进一步了解,声明在main函数中的变量也是局部变量。

这里声明了一个test testred;//声明为局部变量,这里将testred声明为局部变量,在调试过程中,可知当进入之后InitRed(&testred);函数之后,testred变得无效,因此也就无法对testred进行操作。

这里声明了一个test testred;//声明为全局变量,这里将testred声明为全局变量,在调试过程中,可知当进入之后InitRed(&testred);函数之后,在1处将全局变量testred的地址赋与局部变量colormytest,由于testred是全局变量,因此也就相当于对testred的操作。

这里也就是下图中的两个圈圈中的意义是相等的。

分割线

完整的例子


#include "stdio.h"
#include <iostream>
#include <string>
#include "stdlib.h"

//string a;
typedef struct
{
	char redStruct[128];
	char *bule; //这里声明的指针时未定义的指针
}colormy;

typedef struct  
{
	colormy atest;
	char btest;

}test;
test testred;//声明为全局变量
char BUSHID[128];

int InitRed(test* red)
{
	printf(" red = %p\n", red);
	colormy* colormytest;
	/*colormytest = &red->atest;
	for (int i=0 ;i<100;i++)
	{
		char *temp = new char;
		itoa(i,temp,10);
		colormytest->bule += 11;
	}*/
	(red->atest.bule) =  BUSHID;
	/*colormytest = &(red->atest);
	colormytest->bule = BUSHID;*/

	return 0;
}
int main()
{
	//test testred;//声明为局部变量

	InitRed(&testred);
	testred.atest.bule="asdffsafsd";
	testred.atest.redStruct[127] ='a';
	testred.btest='1';
	InitRed(&testred);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值