C语言struct结构体和指针详解
struct
struct结构体可包含多个不同数据类型的变量
#include<studio.h>
//声明struct
struct MyStruct
{
int age;
char name;
double height;
};
int main() {
return 0;
}
如果要使用则需要给struct一个变量名。上述代码中MyStruct是结构体名而非变量名
#include<stdio.h>
//声明struct
struct MyStruct
{
int age;
char name;
double height;
};
int main() {
//创建结构体变量并使用
//mark为结构体变量名
struct MyStruct mark;
mark.age = 26;
mark.height = 1.87;
mark.name = "mark";
printf("%d", mark.age);
return 0;
}
struct和其他数据类型不同。在创建时需要先创建struct结构体。上述代码中struct为数据类型。MyStruct为struct的命。注意是struct名称而不是变量名称。在main函数中声明了struct类型的mark变量。在声明时需要带上结构体名称也就是MyStruct。这代表着mark所包含的子变量均继承自MyStruct。比如age height和name
指针
内存分区共有好几个分区。但不需要全部都了解。只需要知道栈区 堆区 静态区 常量区。他们分别储存着不同作用域的变量数据

而每个数据都会被单独划分出来。而为了方便找到这些数据内存会为每个数据标上记号。这个记号就是内存地址。内存地址一般为十六进制。而指针的指向就是内存地址
#include<stdio.h>
int main() {
int a = 55;
int* p = &a;
printf("%p", p);
return 0;
}
上述代码中int*代表声明一个名为p的整数类型的指针变量。&为取址符。将a变量的内存地址赋值给名为p的指针变量。打印结果为0000000469CFF534。是一串十六进制的内存地址。但是p变量本身不是地址。她只是一个指向内存地址的指针。而p变量保存的值才是内存地址。并且内存地址不是a的值。而是保存55这个值的地址编号。而指针变量也只能保存内存地址。其他类型的数据都无法保存
指针的作用可以作用在很多地方。例如直接用指针更改值
#include<stdio.h>
int main()
{
int a[] = {4,3,6};
printf("%s%d","\n改之前为:",a[1]);
int* m = &a[1];
*m = 666;
printf("%s%d","\n改之后为:",a[1]);
return 0;
}
打印结果

上述代码中声明了一个数组。通过指针更改了数组中的值。除此之外指针也可以传递到自定义函数当中。
#include<stdio.h>
struct tt{
int g;
char o;
};
void jk(struct tt *io){
io -> g = 999;
printf("%s%d","\n结构体设置g初始值为:",io -> g);
}
int main()
{
int a[] = {4,3,6};
printf("%s%d","\n改之前为:",a[1]);
int* m = &a[1];
*m = 666;
printf("%s%d","\n改之后为:",a[1]);
//声明结构体变量
struct tt kk;
//调用自定义函数并传入指针
jk(&kk);
return 0;
}
打印结果

上述代码中声明了一个结构体和自定义函数。首先声明了一个结构体的变量。然后将结构体变量的指针传入到自定义函数当中。然后在自定义函数当中通过传入的指针拿到结构体当中的g子变量并初始化
需要注意结构体如果是以变量名直接使用的情况下则是用 .直接访问结构体的子变量。如果是以指针的方式访问则需要使用 -> 符号才能访问结构体的子变量