一.结构体数组与指针
1.结构体数组动态分配内存
struct csdn
{
int id;
int num;
};
void main1x()
{
int num;
scanf("%d", &num);
struct csdn *p1 = malloc(sizeof(struct csdn)*num);//堆
struct csdn *p2 = alloca(sizeof(struct csdn)*num);//栈上
memset(p1, 0, sizeof(struct csdn)*num);
memset(p2, 0, sizeof(struct csdn)*num);
for (int i = 0; i < num; i++)//动态数组引用方式
{
printf("%d,%d %d %d\n", p1[i].id = i, p1[i].num, p2[i].id = i, p2[i].num);
}
for (int i = 0; i < 10;i++)
{
int id;
scanf("%d", &id);
for (int j = 0; j < num;j++)
{
if (id==p1[j].id) //注意i ,j
{
p1[j].num++;
p2[j].num++;
break;
}
}
}
for (int i = 0; i < num; i++)//动态数组引用方式
{
printf("%d,%d %d %d\n", p1[i].id=i , p1[i].num , p2[i].id=i , p2[i].num );
}
//for (int i = 0; i < num;i++)//动态数组引用方式
//{
// printf("%d,%d %d %d\n", p1[i].id=i, p1[i].num=i+2, p2[i].id=i+1, p2[i].num=i+3);
//}
free(p1);
system("pause");
}
2.结构体指针形式
void main2x()
{
//int num;
// scanf("%d", &num);
//三种用途
//struct csdn *p1 = malloc(sizeof(struct csdn)*num);//堆
struct csdn *p2 = (struct csdn[]){1,2,3,4};
printf("\n%d", p2[1].id);
printf("\n%d", (&p2[1])->id);
printf("\n%d", (p2+1)->id);//p[i] *(p+i) &p[i]= p+i
printf("\n%d", (*(p2 + 1)).id);//指针的形式
//struct csdn csdnx = { 10, 20 };
//struct csdn *p = &csdnx;
//printf("\n%d", p->id);
//printf("\n%d", (*p).id);
system("pause");
}
3.结构体二维数组
void main()
{
struct csdn csdndata[100]; //int a[100]
struct csdn *p3 = csdndata;//int *p
struct csdn csdndataX[10][10]; //int a[10][10]
struct csdn(*p4)[10] = csdndataX;//int (*p)[10]=malloc(sizeof(int)*100)
struct csdn(*p5)[10] = malloc(sizeof(struct csdn) * 50);//
p5[3][4];
}
4.匿名结构体不可以创建变量
5.结构体至少有一个元素
6.匿名结构体如果有指针,指针可以开辟内存,就不可以锁定变量数量
7.数组名和指针的区别是:数组名是常量,指针是变量
8.结构体两种初始化方式:struct Mystruct my[]={10,10};
struct Mystruct *p=(struct Mystruct []){10,10};
9.结构体里面a.b等价于&a->b
10.(*结构体指针名).成员名==结构体指针名->成员名==结构体变量名.成员名
二.结构体大小与内存对齐
1.结构体与最大单位对齐是为了缩短内存寻址时间
2.
1.结构体数组动态分配内存
struct csdn
{
int id;
int num;
};
void main1x()
{
int num;
scanf("%d", &num);
struct csdn *p1 = malloc(sizeof(struct csdn)*num);//堆
struct csdn *p2 = alloca(sizeof(struct csdn)*num);//栈上
memset(p1, 0, sizeof(struct csdn)*num);
memset(p2, 0, sizeof(struct csdn)*num);
for (int i = 0; i < num; i++)//动态数组引用方式
{
printf("%d,%d %d %d\n", p1[i].id = i, p1[i].num, p2[i].id = i, p2[i].num);
}
for (int i = 0; i < 10;i++)
{
int id;
scanf("%d", &id);
for (int j = 0; j < num;j++)
{
if (id==p1[j].id) //注意i ,j
{
p1[j].num++;
p2[j].num++;
break;
}
}
}
for (int i = 0; i < num; i++)//动态数组引用方式
{
printf("%d,%d %d %d\n", p1[i].id=i , p1[i].num , p2[i].id=i , p2[i].num );
}
//for (int i = 0; i < num;i++)//动态数组引用方式
//{
// printf("%d,%d %d %d\n", p1[i].id=i, p1[i].num=i+2, p2[i].id=i+1, p2[i].num=i+3);
//}
free(p1);
system("pause");
}
2.结构体指针形式
void main2x()
{
//int num;
// scanf("%d", &num);
//三种用途
//struct csdn *p1 = malloc(sizeof(struct csdn)*num);//堆
struct csdn *p2 = (struct csdn[]){1,2,3,4};
printf("\n%d", p2[1].id);
printf("\n%d", (&p2[1])->id);
printf("\n%d", (p2+1)->id);//p[i] *(p+i) &p[i]= p+i
printf("\n%d", (*(p2 + 1)).id);//指针的形式
//struct csdn csdnx = { 10, 20 };
//struct csdn *p = &csdnx;
//printf("\n%d", p->id);
//printf("\n%d", (*p).id);
system("pause");
}
3.结构体二维数组
void main()
{
struct csdn csdndata[100]; //int a[100]
struct csdn *p3 = csdndata;//int *p
struct csdn csdndataX[10][10]; //int a[10][10]
struct csdn(*p4)[10] = csdndataX;//int (*p)[10]=malloc(sizeof(int)*100)
struct csdn(*p5)[10] = malloc(sizeof(struct csdn) * 50);//
p5[3][4];
}
4.匿名结构体不可以创建变量
5.结构体至少有一个元素
6.匿名结构体如果有指针,指针可以开辟内存,就不可以锁定变量数量
7.数组名和指针的区别是:数组名是常量,指针是变量
8.结构体两种初始化方式:struct Mystruct my[]={10,10};
struct Mystruct *p=(struct Mystruct []){10,10};
9.结构体里面a.b等价于&a->b
10.(*结构体指针名).成员名==结构体指针名->成员名==结构体变量名.成员名
二.结构体大小与内存对齐
1.结构体与最大单位对齐是为了缩短内存寻址时间
2.