结构数组和结构指针

数组名

数组名可以作为数组第一个元素的指针。我们由数组和指针的关系知道,a代表这个地址数值,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址。数组中的其他元素可以通过a的位移得到,此时的进阶是以数组中单个的元素类型为单位的,即a+i= & a[i]。

另外:(有关数组名取地址)
&a代表的不是取a这个变量的地址,而是取数组的地址。虽然&a和a的内存地址相同,但它们的意义不相同,它是代表整个数组的,它的进阶单位是整个数组的字节长度
摘自:https://blog.csdn.net/loongkingwhat/article/details/78910921
https://www.cnblogs.com/liushui-sky/p/7993007.html

结构数组的对齐

我领悟的关键:前面申好的 对齐后成为后面的倍数,最后再对齐到最大间隔的倍数。

#include<stdio.h>
struct s1 
{ 
   char  name[9];
   int age;
   short t;
   //9要先对齐到12 再继续int age 
   //最后2对齐到4 
   //size 12+4+4=20 
}; 
struct s2 
{ 
   short t;
   char  name[11];
   int age;
   //11对齐到12 然后14对齐到16 应该是这样 
   //前面申好的 对齐后成为后面的倍数  
   //size  20 
}; 
struct s3 
{ 
   int age;
   char  name[8];
   short t;
   //2对齐到4  
   //size 16 
};
struct s4 
{ 
   int age;
   char  name[9];
   short t;
   //注意 9先对齐到10 12刚刚好    
   //size 4+12=16 
};
struct s5 
{ 
   int age;
   char  name[11];
   short t;
   //11先对齐到12 14对齐到16
   //size 20 
};  
struct s6 
{ 
   char  name[11];
   short t;
   //11对齐到12 
   //size 14 
};  
int main()
{
	printf("s1:%d\ns2:%d\ns3:%d\ns4:%d\ns5:%d\ns6:%d\n",sizeof(s1),sizeof(s2),sizeof(s3),sizeof(s4),sizeof(s5),sizeof(s6)); 
	//结构的"对齐" 
	//关键: 前面申好的 对齐后成为后面的倍数,最后再对齐到最大间隔的倍数。 
}

运行结果:
在这里插入图片描述参考:https://blog.csdn.net/wsq119/article/details/81478545

结构数组的指针

#include<stdio.h>
struct ss
{ 
   char  name[10];
   int age;
}; 
int main()
{
	struct ss std[3];
	struct ss *p=std;
	std[0].age=1;
	printf("%p\n",&p);//指针p的地址
	printf("%p\n%p\n%p\n%p\n%p\n%p\n%p\n",p,std,&std[0],std[0].name,&std[0].name,&std[0].name[0],p->name); 
	//std结构名表示std的地址 p指向std,因此p就为std的地址 
	printf("\n");
	printf("%d\n%d\n%d\n%d\n",&std[0].name,std[0].name+1,&std[0].name+1,&std[0].name[0]+1);  
	//std[0].name+1和&std[0].name+1的结果不是一样的 因为前者是结果加1 后者是地址加1,相当于指针移动了一位 
	//std[0].name+1比std[0].name移动了10位;
	//std[0].name[0]+1比std[0].name[0]移动了1位  
}

运行结果:
在这里插入图片描述

指针相减

两个指针相减返回的是步长的个数 而不是具体

#include<stdio.h>
struct ps{
  double i;
  char arr[24];
};
int main(){
  struct ps s[3],*p1,*p2;
  p1=s;  p2=&s[2];
  printf("%d\n%d\n%d\n",p1,p2,p2-p1);//两个指针相减返回的是步长的个数 而不是具体 
  printf("%d\n",(char *)p2-(char *)p1);
  return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值