本文主要是介绍【C语言】关于数组名遇到的问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近在写程序的时候遇到这么一个问题:用结构体创建了一个数据组。然后想用结构体作为参数去运行函数:
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;
}
这篇关于【C语言】关于数组名遇到的问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!