最近在写程序的时候遇到这么一个问题:用结构体创建了一个数据组。然后想用结构体作为参数去运行函数:
test((creat*)data);
test((creat*)&data);
上面两种方式都可以运行。结果正确。
其中,data为数组名;creat为结构体的句柄;test为函数名。
数组名data和&data的内存地址相同。数组名相当于一个指针,指向第一个元素。也就是代表数组的首地址。
测试后发现。data+1代表的是data[1]的首地址;而&data+1代表的是整个数组结束后的地址。区别如下图:
测试程序如下:
#include <stdio.h>
typedef void(*x)(void);
typedef struct{
unsigned int a;
char* s;
x xx;
}creat;
void swap(void){
printf("**********************************\n");
}
void test(creat* pp){
pp[0].s="hello!";
pp[1].s="byebye!";
}
void test1(creat* pp){
pp->s="wowowowow!";
}
int main()
{
unsigned int b;
creat data[3],tl;
data[0].s="hi!";
data[1].s="bye!";
data[0].a=1;
data[1].a=2;
tl.a = 3;
tl.s ="wow!";
printf("data[0]=%d \n",data[0].a);
printf("data[0]=%s \n",data[0].s);
printf("data[1]=%d \n",data[1].a);
printf("data[1]=%s \n",data[1].s);
printf("tl.a=%d \n",tl.a);
printf("tl.s=%s \n",tl.s);
printf("=====================\n");
test((creat*)data);
test1(&tl);
printf("data[0]=%d \n",data[0].a);
printf("data[0]=%s \n",data[0].s);
printf("data[0]=%d \n",data[1].a);
printf("data[0]=%s \n",data[1].s);
printf("tl.a=%d \n",tl.a);
printf("tl.s=%s \n",tl.s);
data[0].xx=swap;
data[0].xx();
printf("b=%d \n",&data);printf("b=%d \n",data+1);
printf("b=%d \n",&data[1]);printf("b=%d \n",&data+1);
return 0;
}