【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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值