C语言已经提供了内置类型,例如:char,short,int ,long,float,double等,但如果我想描述一个事物,单单靠这些内置类型是不够的,例如描述一个学生,或者描述一本书,此时的单一内置类型就是不行的,描述一个学生需要描述身高,体重,学号,成绩等等。为了解决这个问题,我们需要学习结构体这种自定义的数据类型。
现在,我们要描述一个学生的名字,年龄,身高,学号,在结构体中这样表示:
struct Stu
{
char name[20];
int age;
char sex;
char id;
};
值得注意的是,反大括号后的分号不能掉了。
而对于结构体变量的定义和初始化,我们这样做:
Struct Point
{
int x;
int y;
}p1;//声明类型的同时定义变量p1
Struct Point p2;
Struct Point p3 = {10,20};
而如果我们要指定顺序,就要用到“.”操作符:
Struct Stu
{
char name[15];
int age;
};
Struct Stu s1 = {"lisi",18};
Struct Stu s2 = {.age=20,.name="wangwu"};
而对于结构体嵌套初始化:
Struct Node
{
int data;
Struct Point p;
Struct Node* next;
}n1 = {10,{4,5},Null};
Struct Node n2 = {20,{5,6},Null};//结构体嵌套初始化
其实就是大括号里再套大括号。
而结构体变量的访问,则依靠"."操作符,使用方式:结构体变量.成员名
#include
Struct Point
{
int x;
int y;
}p = {1,2);
int main()
{
printf("x:%d y:%d\n", p.x, p.y);
return 0;
}
在日常生活中,我们会见到酒店的房间上标有房间号
而在计算机中,你想找到一个数据,就必须先找到其地址,而这个地址,我们也称其为指针。
我们可以理解为:内存单元的编号==地址==指针。而我们知道,在C语言中创建变量其实就是向内存中申请空间,例如:
#include
int main()
{
int a = 5;
&a;
printf("%p\n", &a);
return 0;
}
我们想要获取a的地址,该怎么做呢,答案是使用取地址操作符"&":
而整型变量占四个字节,所以应该会有四个连续的地址,打印出来的是最小的一个地址。
而我们我们想要将变量的地址存储起来,则需要使用解引用操作符"&":
int a = 5;
int * pa = &a;
此时指针变量pa的值就是a的值 5,我们对pa的值进行操作就可以间接地将a值改变。
而在64位的计算机下,不同类型指针变量的大小都是8个字节,而他们的区别则是指针解引用的权限(一次能操作几个字节):
#include
int main()
{
int n = 10;
char * pc = (char*)&n;
int *pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc+1);
printf("%p\n", pi);
printf("%p\n", pi+1);
return 0;
}
得到如下结果:
得出结论:char*类型+1跳过1字节,int*类型+1跳过4字节。
即指针类型觉得指针向前或向后走一步有多大。
---------------------------------------------------------------EOF------------------------------------------------------------------