数组名
数组名可以作为数组第一个元素的指针。我们由数组和指针的关系知道,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;
}