目录
指向结构体类型数据的指针:
指向结构体变量的指针:
创建:
应用:
注意事项:
指向结构体数组的指针
创建:
应用:
注意:
用结构体变量和指向结构体的指针做函数的参数
注意:
下期预告:结构体的内存对齐
雨过终有天晴,不是吗
在前面我们已经了解了普通变量指针,数组指针,函数指针。指针的合理运用可以让我们的程序运行更加高效,代码的数量得到有效的减少。这里我们来讲解结构体的指针:
如果对指针不是太了解,也可以看一下这篇关于指针的文章:
【小白都爱的指针入门理解 】http://t.csdnimg.cn/IOpzx
指向结构体类型数据的指针:
一个结构体变量的指针就是改变量所占据的内存短的起始地址。我们可以设置一个指针来指向结构体的其实位置地址,同时也可以用来指向结构中的元素。
指向结构体变量的指针:
创建:
与普通指针的创建方式一样,我们需要先声明指针的类型“struct student",接着表明这是一个指针
struct student {int age;char name[20];int num;}student1;
int main()
{struct student* p1 = &student1;return 0;
}
应用:
我们可以通过指针来给结构体进行初始化,以及对结构体的成员值进行改变:
int main()
{struct student* p1 = &student1;(*p1).age = 100;(*p1).name[0] = 's';(*p1).num = 200;return 0;
}
注意事项:
- 在对结构体成员中的数组赋值时我 们要找到最低单位,也就是要找到数组中的单个元素,不能对数组整体赋值。
- 因为运算优先级” .” 要大于” * “,这里的()不能省去。
- 这里的(*p).可以用p->来代替,->为指向运算符
指向结构体数组的指针
先前我们已经介绍过,指针可以指向普通变量数组。同样指针也可以指向结构体数组,两者具有相似性。
创建:
方法与上述方法相同:
struct student {int age;char name[20];int num;}arr[3] = {{10,"haha",100},{20,"lili",200},{30,"hehe",300}
};//定义结构体数组int main()
{struct student* p = &arr;//创建return 0;
}
应用:
这里依旧要准寻找到最小单位的准则!
int main()
{struct student* p = &arr[0];//创建printf("%d\n", (*p).age);p++;printf("%d\n", (*p).age);return 0;
}
运行结果:
10
20
注意:
- 这里&arr指向数组中第一个元素的地址。
- 这里p++会跳过一个结构体指向下一个结构体,而不是指向原结构体下一个元素。
- p已经被程序定义为指向struct student 类型数据的指针,它只能指向结构体类型,而不能指向结构体中的单个元素。
用结构体变量和指向结构体的指针做函数的参数
将一个结构体变量的值传参我们这里介绍两种:
1.结构体成员传参,将结构体的单个成员的值传入:
int add(int a)
{return 2 * a;
}
struct student {int age;char name[20];int num;
}student1={10,"asdf",300};
int main()
{int m = add(student1.age);return 0;
}
2.结构体地址传参:
void pff(int* p)
{*p = (*p) * 2;
}
int main()
{int* p = &(student1.age);pff(p);printf("%d\n",*p);return 0;
}
注意:
传值与传址两者的区别,传值并不会改变原本值的大小,而传址将会改变原本变量值的大小。
这里我们打印出来的值为20!
这篇文章到这里就结束了,如果感觉不够了解,可以回顾上期文章:
【结构体基础全家桶(1)创建与初始化 】http://t.csdnimg.cn/8n2kP