结构体指针
-----------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!-------------------------
一.结构体
1.什么是结构体;
当一个整体由多个数据构成时,我们可以用数组来表示这个整体,但是数组内部的每一个元素都必须是相同类型的数据。在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名、年龄、身高等数据构成,那么我们就要用到结构体;
2.定义
struct 结构体名
{
数据类型1,成员名;
数据类型2,成员名;
......
};
例如: struct student{
int age;
char *name;
};
结构体实际上就行当于我们定义一个变量类型;
3.结构体变量名
struct person{
int age;
float height;
};
struct person p; 先定义结构体类型,在定义变量名;
struct person{
int age;
float height;
}p; 定义结构体同时定义变量;
struct{
int age;
float height;
}p; 省略结构体类型名,直接定义变量名。
4.结构体注意
结构体是可以包含结构体的;
定义结构体类型时候是没有分配存储空间的,就像int类型没有存储空间一样,只有定义结构体变量时才会分配空间存储;
结构体存储方式是按成员名依次排列的;
结构体如果类型相同,那么所占空间为其成员类型之和;如果不相同,那么为占最大存储空间的类型的倍数;
5.结构体初始化
struct person{
int age;
float height;
};
struct person p = {17,50.5};定义变量的同时初始化;
6.结构体的使用
struct person{
int age;
float height;
};
struct person p ;
想访问年龄 p.age = 17;
struct person{
int age;
float height;
};
struct person p = {17,50.5};
struct person pp = p ; 同一类型的结构体中可以相互赋值;
二.结构体数组
1.定义,和结构体一样3种方式;
struct student{
int age;
char *name;
};
struct student stu[10];
struct student{
int age;
char *name;
}stup[10];
struct{
int age;
char *name;
}stup[10];
2.初始化
struct student{
struct student stu[2] = {{17,"zs"},{23,"sl"}};
int age;
char *name;
};
三.结构体作为函数参数
将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参。
四.指针
1.定义
指针向的数据类型 * 指针变量名;
char *p; int *pp; float *ppp;
2.指针的赋值
int a = 10;
int *p ;
p = &a; 先定义,再赋值;
int a = 10;
int *p1 = &a; 定义的同时赋值;
3.改值
int a = 10;
int *p = &a;
*p = 5; 将a的值变为5 了;
指针一定要初始化,否则是一个野指针,威害很大;
五.指针与数组
1.指针与一位数组
数组是一块连续的内存,数组元素的下标就是该元素的位置相对与数组起始地址的偏移量
因为第一个元素的地址与数组名地址是相同的,所以便宜量是0数组就相当于一个指针,数组的变量名就是地址;
因为第一个元素的地址与数组名地址是相同的,所以便宜量是0数组就相当于一个指针,数组的变量名就是地址;
int num[] = {1,2,5};
int *p = num;
遍历数组:
for (int i = 0;i < 3;i++)
{ printf("%d",*p);
p++;
}
p + i,将不会改变变量的地址;
p++ 将改变变量的地址;
2.数组名和指针的区别
数组的地址还是数组的地址,指针的地址变量的地址不是指针变量里存放的地址
数组变量的指向不可以改变
指针变量就是就是用来存放地址变量,系统为其开辟了存储空间,所以指针变量中地址可以任意改变,但是系统没有数组变量分配存储空间,当系统编译后所有出现数组名的地方都会被替换成该数组的首地址,所以你不可改变数组变量的指向。
六.指针与字符串
以前我们是先定义字符串,再将字符串地址给指针:
char name[] = "sl"; char *p = name;
而我们还可以:
char *p1 = "sl";
两种方式的区别: 第一个定义的是字符串变量;第二个定义的是字符串常量,你不能改变他;
七.指针与函数
1.返回指针的函数
指针也是C语言中的一种数据类型,因此一个函数的返回值肯定可以是指针类型的
返回指针的函数的一般形式为:类型名 * 函数名(参数列表)
2.函数指针
定义:指向函数的指针称为函数指针,也就存放函数地址的变量就是函数指针变量;
格式: 返回值类型 (*函数指针名称) (参数类型,参数类型)
例如: int sum(int a,int b) 指针 int (*point)(int,int)
初始化; point = sum;
注意:由于这类指针变量存储的是一个函数的入口地址,所以对它们作加减运算(比如p++)是无意义的
作用:将函数作为参数在函数间传递
八.指针与结构体
定义:结构体指针变量的定义形式:struct 结构体名称 *指针变量名
例如: struct person{
int age;
char *name;
};
struct person stu = {11,"df"};
struct person *p ; 定义了一个结构体指针;
p = &stu; 将结构体地址给指针;
访问成员:
stu.age stu.name
(*p).age (*p).name
p->age p->name 最常用的方式
-----------------------------ASP.Net+Unity开发、.Net培训、期待与您交流!-------------------------