第二次课 --结构体指针和数组

struct AA{
int a;
char b;
}Q,W;

struct BB{
float x1;
short x2;
int x3;
}E,T,U;

Struct CC{
double k1;//8
struct AA k2;//5
struct BB k3;//10
struct BB k4;//10
}H;

int main()
{
int a;
char b;
int *w1;
w1=&a;//取a值的地址;
*w1=33;//w1指向的区域是33,打印a的值,结果是33;
w1=44;//这句实际上是在为w1的地址赋值,w1不再指向a的地址,而是指向44;但是这样直接赋值比较危险,因为不知道地址为44的空间是否为其他变量所用;
*w1=55;//给地址为44的w1赋值;
printf(“a=%d b=%c \n”,a,b);

Q x1;//5
Q *w2=&x1;
x1.a=88;
w2->a=345;//其实用.也可以,但用箭头是为了区分w2是一个指针,方便阅读。这里的w2没有加*。
printf(“x1.a=%d x1.b=%d \n”,a,b);
Q x2;//5
w2=&x2;//将x2的地址赋值给w2;
w2->a=777;
Q *w3=w2;//新建w3和w2指向同一区域
w3->a=999;
T x3;//10
T x4;//10
H x5;//33

}


typedef struct AA
{
int a;
char b;
}Q,*K;//此处k可以直接用来声明指针类型;
int main()
{
Q x1,x2,x3;
K x4=(Q*)malloc(5);
/*直接声明的指针是没有默认指向的所以没有所谓的a和b;但如果
typedef struct AA
{
int a;
char b;
struct AA* c;
}Q,*K;
这里面这个c有默认指向。*/
x4->a=887;
Q* x5=(Q*)malloc(5);//给x5申请一个5字节空间,4字节给int,1字节给char;其实和上面 w1=44是一样的意思,但是上面不合法。
x5->a=66;
x5->b=’h’;

//数组
int s1=90;
int *m1=&s1;
int f1[]={1,2,3,4};
int f2[3];//在c语言中这里创建了3个随机数,但是在其他高级语言可能是3个0;
m1=f1;//f1是数组,前面不需要加&对m1进行赋值,可以与前面s1进行对比,c语言太不规整了。若写成m1=f1的时候会警告;
//须知道将f1的地址赋值给m1,是将第一个地址给了m1;
m1[0]=88;
m1[1]=66;
m1=f2;
Q f4[3]={x1,x2,x3}//f4是一个结构体数组,这里c语言是将x1,x2,x3拷贝过来的,对f4进行操作,对原来的x1,x2,x3无影响,其他高级语言是指向过来的,则反之。
f4[0].a=76;
f4[0].b=’w’;
int f5[3][4]={{1,2,3,4},{2,3,1,5},{4,5,7,9}};
int *e1=(int*)malloc(40);//申请一个长度为40的数组;
e1[0]=99;e1[1]=33;
e1=f1;e1=f2;//指针类型数组长度可以改变,可以将其他长度数组赋值给e1;虽然是相等其实是指向。
/*
1.f2=f1不可以,非指针类型数组长度不可以改变,这里相当于纯拷贝过来
2.数组名不是指针类型吗?
 不是,传参的时候数组跟指针看起来一样,但不是;
3.结构体类型可以相互赋值x1=x2,因为系统认为他们类型一样。
*/
int ** e2=(int**)malloc(sizeof(int**)*5);//指针类型占8字节;其实和malloc(40)等价;int**是二维数组。
e2[0]=e1;//长度是10
e2[1]=f1;//长度是4
e2[2]=f2;//长度是3
//指针类型二维数组e2的长度十分灵活,不像f5;只要是5个int*就可以。
int ***e3=(int***)malloc(40);
e3[0]=e2;//e2可能是一维数组或二维数组,所以e3可能是二维数组或者三维数组。
}

直接声明的变量一般int型未赋值默认为0;char型未赋值默认为一个白方块其实内存里也是0;
而结构体内部的变量不一定,看内存是否干净;
结构体AA申请的时候一次性申请5字节;

变量和其值中间还有一块地址;(之后解释)

1>结构体包含基本数据类型;
2>结构体可以包含结构体类型;
3>可以给结构体取一个或者多个别名;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值