之前学到了指针,数组,指针数组,结构等。他们之间可以互相结合使用,原则同正常使用。
上代码:
#include<iostream> struct aa //定义结构 { int a; }; struct aaa //定义结构aaa { int b; int c; }; int main() { using namespace std; aa s1, s2, s3, s4, s5; //使用定义aa 的结构s1,s2,s3,s4,s5 s1.a = 1; //s1结构的变量值为1 cout << s1.a << endl << endl; //输出s1结构的变量值 //以下是指针 cout << "以下是指针" << endl; aa *b = &s2; //指针b指向结构s2的地址 (*b).a = 5; //使用(*指针名).变量名 形式,为其赋值 cout << s2.a << endl << endl; //输出结构s2的变量的值 aa *c = &s3; //指针c指向结构s3地址 c->a = 10; //使用箭头运算符-> 指针名->变量名 形式为指针指向的结构变量赋值 cout << s3.a << endl << endl; //输出结构s3变量的值 //以下是数组 cout << "以下是数组" << endl; aa bb[3]; //创建结构数组,数组元素为3 bb[0].a = 3; //数组第一个元素的变量a值为3 //bb是数组,bb[0]是数组第一个成员,bb[0].a是数组bb中第一个成员的int a变量 cout << bb[0].a << endl << endl; //输出数组bb第一个成员的变量a (bb + 1)->a = 6; //数组 或 字符串名 实际上就是指针名,注意数组名是bb,bb相当于上面的指针b。因此指针使用b->a时,数组这边是bb->a; //又因为bb实际上等同于bb[0],因此bb+1就等同于bb[1],而bb+2等同于bb[2]。因此(bb+1)->a相当于bb[1].a cout << bb[1].a << endl << endl; //以下是指针数组 cout << "以下是指针数组" << endl; aa *cc[2] = { &s4,&s5 }; //创建指针数组cc,成员为2个 //因为是指针,所以想要操作指针所指向地址的值的话,就必须给指针初始化(即&s4,&s5},不然就无法操作 cc[0]->a = 2; //cc是指针数组,cc[0]是指针,因为是指针,所以可以用 指针->变量名 这是指针遇见结构可以使用箭头运算符 cout << cc[0]->a << endl; (*cc[1]).a = 4; //cc[1]也是指针,于是使用 (*指针名).变量名 这种形式来为结构的变量赋值 cout << cc[1]->a << endl << endl; //以下是指针涉及到多个变量的结构 cout << "以下是指针涉及到多个变量的结构" << endl; aaa a1, a2; //先创建使用aaa结构的 结构a1和a2 aaa *dd[2] = { &a1,&a2 }; //创建指针数组dd,分别指向a1和a2 *dd[0] = { 11,22 }; //dd是指针,dd[0]是指针dd第一个成员(但,是地址),*dd[0]是第一个成员的值,可以充当结构名 //当初始化结构的时候,我们使用 结构名={ };这种形式进行初始化 //因此*dd[0]相当于 a1,于是初始化,两个变量分别为11和22 cout << dd[0]->b << endl; //输出指针第一个变量b cout << (*dd[0]).c << endl << endl; //输出结构第二个变量c //以下是指向指针数组的指针 cout << "以下是指向指针数组的指针" << endl; aa **e = cc; //cc是数组指针,数组又是指针,单数组的话,要用*e,但又是指针,所以是**e cout << e << endl; //因为e是指向指针数组的指针,因此地址是相同的,都是指向指针数组的第一个元素的地址 cout << cc << endl; auto f = cc; //auto创建自动符合类型的f cout << f << endl; //f输出的是地址,说明f是指针 system("pause"); return 0; }
①给结构中某个变量赋值:
结构名.变量名={}
给结构中某个变量赋值
②当指针遇见结构:
(*指针名).变量名=
可以给结构中某个变量赋值。
指针名->变量名=
也可以给结构中某个变量赋值。
这个时候,(*指针名)充当的就是结构名的角色。
③结构数组:
数组名[编号].变量名=
通过这种形式给数组结构的成员的结构变量赋值。
数组名[编号]充当的就是结构名的角色,
注意:(1)编号为0的是第一个元素,以此类推。
(2)数组名 实际上是地址
④当指针数组遇见结构的时候,需要给指针数组赋值
比如aa *cc[2] = { &s4,&s5 }
s4是结构,cc是指针数组,cc[0]是第一个指针,那么要将结构赋值给指针,就需要给结构名前加&表示地址,
于是上面那行代码就相当于cc[0]=&s4;cc[1]=&s5;
⑤当指针指向指针数组时:
指针数组中的每个成员,是指针,指向相应的内存地址,比如cc数组中的2个指针,分别指向&s4和&s5。
数组名,实际上是数组的地址;
因此,指针数组名,实际上是储存着2个指针的数组地址,而非这2个指向的数组地址。
也就是说:
cc[0]指向&s4,
&cc[0]指向储存cc[0]这个指针的 内存地址,
cc是储存cc[0]和cc[1]这个指针的内存地址,又是这个数组中第一元素的内存地址,也就是&cc[0];
而一个指针指向这个指针数组时,指向的是储存这个指针数组的内存,而非这个指针数组的指针分别指向的内存地址,即:
e指向的是cc,也是&cc[0]
⑥指针名数组遇见结构时的各种变化:
指针名 是指针数组
指针名[编号] 是指针
*指针名[编号] 是指针的值,可以充当结构名,然后比如说用在:
(*指针名)[编号].变量名={}
可以给相应的结构赋值,但前提是,指针已经被初始化。
⑦几个变化:
结构名.变量名
(*指针名).变量名
指针名->变量名
(*指针名)[编号].变量名
以上几个都是等价的,都是 结构中某个变量 ,但唯一需要注意的是,
使用指针的话,必须进行初始化,未初始化的是不安全的,也是不正确的。