怎样在一个.c档里面取引用另一个.c档里面的静态结构体数组

来源:互联网 发布:win10固态硬盘优化 编辑:程序博客网 时间:2024/05/18 09:18
结构体、指针的应用
结构体的首地址,其实可以看成是一个32bit的整形数据。
下面来看一个实例,关于结构体在、指针的灵活应用
方案一
假设在aaarry.h定义一个结构体,及函数的申明
ypedef struct _AAA
{
int  x;
int  y;
} AAA, *pAAA;


void getpoint( int * p);


aaarry.cpp中函数的定义
static AAA Arry[3]={{1,2},{2,3},{3,4}};


void getpoint( int * p)   
{
(*p) =(int )Arry;
return;
}


想在getpoint.cpp中通过函数去引用Arry数组的元素,通过调用函数getpoint来实现。
int i=0;
int * p;int a[6]={0};
extern void getpoint( int * p);
getpoint(&i);
p=(int *)i;
     for ( int j=0; j<6; j++)
{
a[j]=(*p);
p++;
}


分析上面的代码:定义一个整数i,将i的地址作为getpoint的形参去处理。
(*p)=(int)Arry 将结构体的首地址强制转换为整数,前面说过结构体的首地址,其实是一个32bit的整形。
 getpoint(&i)  这条语句将i的值发生改变,其地址不变。
 p=(int *)i;将i的值强制转化为地址,即结构体的首地址,for循环即可通过首地址,来获取里面的值。注意p++,加4个byte,int型数据,也是占4个byte.


方案二
一个函数的返回值只可能有一个,要想将一个数组的多个元素通过返回值返回给主调函数是不可能的。那么在这里我们通过返回结构体数组的首地址即可获得结构体数组的每个元素。
aaarry.cpp中函数的定义
int getpoint()  
{
return (int )Arry;
}
getpoint.cpp中通过函数去引用Arry数组的元素,通过调用函数getpoint来实现。


int  i = getpoint();
int *p = (int *)i;
for ( int j=0; j<6; j++)
{
a[j]=(*p);
p++;
}


方案三
直接接地址返回给一个函数指针变量
aaarry.cpp中函数的定义
int * getpoint()
{
return (int *)Arry;
}
getpoint.cpp中通过函数去引用Arry数组的元素,通过调用函数getpoint来实现。
int *p = getpoint();
for ( int j=0; j<6; j++)
{
a[j]=(*p);
p++;
}


方案一、二、三的思想是一样的,目的是取得结构体数组的首地址,然后通过其首地址访问其值。
方案四
getpoint的形参为二维数组,其里面的值为地址int *B[3][2]
aaarry.cpp中函数的定义
void   getpoint( int *B[3][2])
 {
  int i;
int j;
    for(i=0;i<3;i++)
 {
      B[i][0]=&(Arry[i].x);
        B[i][1]=&(Arry[i].y);
printf("%d,%d\r\n",B[i][0],B[i][1]);
 }     
}
B[i][0]=&(Arry[i].x);
 B[i][1]=&(Arry[i].y);  将结构体数组元素的地址赋值给二维数组元素。
getpoint.cpp中通过函数去引用Arry数组的元素,通过调用函数getpoint来实现。
void   getpoint(int *B[3][2]);
 int *A[3][2]={0};
int ps[6]={0};
char a[5]={0};
 int point[6]={0};
      getpoint(A);
 int i,j,y;
 int k=0;
 for(i=0;i<3;i++)
 {
for(j=0;j<2;j++)
{


           ps[k]=*(A[i][j]);
           itoa(ps[k],a,10);
 str1.Format("ps[%d]=%s\r\n",k,a);
 str+=str1;
   k++;
}
 }

    SetDlgItemText(IDC_EDIT1,str);
return ;
}




 ps[k]=*(A[i][j])  将从结构体数组得到的地址,取其值,保存在ps数组里面。并在编辑框中显示。
方案五
如果getpoint.cpp中可以找到结构体AAA的定义。
aaarry.cpp中函数的定义
void  getpoint(AAA p[3])
{


for(int i=0; i<3 ;i++)
{
p[i] = Arry[i];
}


}




getpoint.cpp中通过函数去引用Arry数组的元素,通过调用函数getpoint来实现
extern void getpoint(AAA p[3]);
AAA aa[3]={0};
getpoint(aa);


p[i]=Arry[i];  将结构体数组Arry每个元素的首地址赋值给p,即数组的行地址。即可取得数组里面的值。

0 0
原创粉丝点击