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

指针

内存分区共有好几个分区。但不需要全部都了解。只需要知道栈区 堆区 静态区 常量区。他们分别储存着不同作用域的变量数据

e02a0c288b60c03209b7986703daccdd.png

而每个数据都会被单独划分出来。而为了方便找到这些数据内存会为每个数据标上记号。这个记号就是内存地址。内存地址一般为十六进制。而指针的指向就是内存地址

#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;
}



打印结果

77931ae90a0409780aa2c2ba65a34f8e.png

上述代码中声明了一个数组。通过指针更改了数组中的值。除此之外指针也可以传递到自定义函数当中。

#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;
}



打印结果

a9f4cdd416125f0b0e66207bedbee586.png

上述代码中声明了一个结构体和自定义函数。首先声明了一个结构体的变量。然后将结构体变量的指针传入到自定义函数当中。然后在自定义函数当中通过传入的指针拿到结构体当中的g子变量并初始化

需要注意结构体如果是以变量名直接使用的情况下则是用 .直接访问结构体的子变量。如果是以指针的方式访问则需要使用 -> 符号才能访问结构体的子变量