结构体指针
//结构体变量和结构体指针必须是同一类型的
#include<stdio.h>
#pragma warning(disable:4996) //屏蔽4996这个警告
struct stu //定义一个结构体类型stu
{
int num; //成员
char name[20];
};
int main()
{
struct stu boy = {101,"lilei"}; //定义一个结构体变量并赋初值
struct stu* p; //定义一个指针变量p
p = &boy; //把boy的地址给p赋值
printf("sizeof(p)=%lld\n",sizeof(p)); //看p占几个字节,在sizeof上,它返回的是一个64位 (8bytes)的无符号整型,所以占位符应该是%lld
//通过各种方法去引用结构体变量的成员
下面是访问结构体变量成员的方法
printf("boy.num=%d\n", boy.num);
printf("(*p).num=%d\n", (*p).num);//*p=boy,引用指针指向结构体的成员的方法,前提是指针必须指向一个结构体的变量
printf("p->num=%d\n", p->num);
return 0;
}
扩展: 查资料占位符
%d在格式化输入输出中代表int(4bytes),
%ld代表long int(>=4bytes),
%lld代表long long int (8bytes);
结构体指针应用
1.保存 结构体变量的地址
#include<stdio.h>
#pragma warning(disable:4996) //屏蔽4996警告
typedef struct stu {
int num;
char name[10];
float score;
}STU; //结构体新的类型名=struct stu
int main()
{
STU* p, lucy; //定义一个结构体指针变量
p = &lucy; //把lucy的地址赋给p
p->num = 101;
strcpy(p->name, "baby"); //把字符串拷到p指向的name的成员,
//p->name不可直接赋值,因为它是字符数组的名字,是个常量
}
2.传 结构体变量的地址
#include<stdio.h>
#pragma warning(disable:4996)//屏蔽4996警告
typedef struct stu {
int num;
char name[10];
float score;
}STU;
void fun(STU* p) //因为fun没有返回值,所以用void
{
p->num = 101; //给girl的num赋值
strcpy(p->name, "baby");
p->score = 88.6;
}
int main()
{
STU girl;
fun(&girl); //把girl的地址赋给fun的p
//调用fun去改变主调函数girl的值,必须传变量的地址进去,通过地址找到变量然后去赋值
printf("%d %s %f\n", girl.num,girl.name,girl.score);
return 0;
}
结果如下:
3.传 结构体数组的地址
结构体数组,是由若干个相同类型的结构体变量构成的集合。存放在内存里,也有起始地址,其实就是第0个结构体变量的地址。
#include<stdio.h>
#pragma warning(disable:4996)//屏蔽4996警告
typedef struct stu {
int num;
char name[10];
float score;
}STU;
void fun(STU* p,int n) //因为fun没有返回值,所以用void
{
int i;
for (i = 0; i < n; i++) //用循环打印edu数组的内容
{
printf("%d %s %f\n", p[i].num, p[i].name, p[i].score);//p[i]=edu[i]
}
}
int main()
{
//定义一个结构体数组
STU edu[3] = {
{111,"mi",99.9f},
{110,"shi",95.0f},
{109,"wen",90.3f}
};
fun(edu,3); //首地址,
return 0;
}