关于指针的的问题,指针的声明和指针的指向问题。
这里主要解决自己对于上一节的问题的一个解答,正如下面的一个调试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;
}