C中指针、结构体、共用体基本概念

105 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、指针基本概念

1、简介

在计算机中,所有的数据都是存放在存储器中,一般把存储器的一个字节称为一个内存单元,不同的数据类型占有不同的内存单元。为了正确访问这些单元就需要为每个内存单元编号,内存单元的编号也称为==地址==。根据地址就可以找到这个内存单元,所以将地址称为==指针==。

内存单元的指针和内存单元中存储的内容是两个不同的概念。如图: 在这里插入图片描述 字符变量C,其内容为’K‘,C占用了011A号单元。设有指针变量P,内容为011A,指针变量P保存的就是C所占用的地址。我们称指针P指向变量C。 可以说指针是一个地址,指针变量可以被赋予成不同的地址,定义指针的目的就是通过指针访问内存单元。 另外,变量的指针是变量的地址;指针变量是存放地址的变量。指针变量和他指向的变量之间的关系如图所示:(使用 ' * ' 号来表示指向) 在这里插入图片描述

2、基本操作

1、指针变量的声明

类型说明符 *变量名;

例子:

int *m1
float *m2
char *m3

2、指针变量的初始化

指针变量只能赋值地址,使用&

int a;
int *p = &a;
f[10]
int *p1 = f   //当为数组时,赋值给指针变量的是数组的第一个元素的首地址,也即f[0]

3、指针变量的引用

(1)给指针变量赋值
	int i,*p;
	p = &i;
(2)直接引用指针变量名
	int i,j,*p=&i,*q;
	q=p  //此时q的地址就是p的地址
(3)通过指针变量来引用它所指向的变量
	int i=1,j=2,k,*p=&i;
	k = *p + j;  //k的值为3,*p代表的是i的值为不是i的地址,p代表的是i的地址
	

4、指针变量的运算

指针变量的运算主要在指针与数组部分。

int a[10],*p;
p = a;  //指针变量p为数组a的首地址,也即a[0]
p = p + 2;  //此时p指向a[2]

5、注意事项

  • 指针变量可以是空值NULL

  • 在对指针变量赋值是,变量前不能再加上*,而在声明初始化时可以。

      int a,*p;
      *p = &a;  //错误的赋值方法,因为此时*p表示的是指针指向的变量的内容
      p = &a//正确的赋值方法
      或者直接初始化:
      int a,*p = &a;
    
  • 指针变量赋值时,只能赋值指针变量同类型的。若为int则赋值的地址的变量也应该时int

  • 指针深入即分为:指针与函数、指针与数组、指针与字符串、指针使用安全与误用。

二、结构体基本概念

1、简介

结构体属于一种构造数据类型(数组也是构造数据类型,和基本数据类型并列)。结构体不同于数组的是,若是一组不同类型的数据,则使用结构体,而不能用数组,因为数组中的数据必须是相同的数据类型。结构体是由若干个成员组成,而每个成员既可以是一个基本的数据类型也可以是一个构造数据类型。

2、基本操作

1、定义结构体类型和结构体变量

结构体定义如下:

struct 结构名{
	数据类型 成员名1
	数据类型 成员名2
	数据类型 成员名3
	...
};

例:

struct stu{
	int num;
	char name[20];
	char sex;
	float score;
};

结构体变量则是在结构体后进行声明:

struct stu{
	int num;
	char name[20];
	char sex;
	float score;
}student1,student2;
其中student1,student2是结构体变量
同时可用另一种方法声明:
struct stu{
	int num;
	char name[20];
	char sex;
	float score;
};
struct stu student1,student2

为什么要区分结构体和结构体变量呢?结构体即是一种数据类型,类似于int,float;int这种基本数据类型C已经进行了预定义。系统并不对结构体进行内存分配,而系统对结构体变量进行内存分配。同时结构体变量可以用来赋值、运算等操作。可以像基本数据类型那样去理解,如图: 在这里插入图片描述

2、引用结构体变量

在定义完结构体变量后,即可对结构体变量进行引用(赋值、存取、运算)。结构体成员的引用格式如下:

结构变量名.成员名
student1.sex = "man"; //赋值操作

3、初始化结构体变量

可以在定义结构体时初始化,也可以在定义完结构体后再进行初始化:

struct stu{
	int num;
	char name[20];
	char sex;
	float score;
}student1,student2={102,"法外狂徒张三","man",60};
另一种方法:
struct stu{
	int num;
	char name[20];
	char sex;
	float score;
};
struct stu student2={102,"法外狂徒张三","man",60};

3、typedef定义类型的作用

typedef主要用来为自定义数据类型提供简洁的类型名称。比如:

typedef struct stu{
	int num;
	char name[20];
	char sex;
	float score;
};
stu student1; //此时声明变量时已不再需要前面的struct

三、共用体基本概念

1、简介

共用体基本与结构体相同,不同点是结构体中各个成员都有自己的存储单元,而在共用体中,成员共用一段内存,内存的长度是最长的那个。

2、基本操作

1、定义共用体类型和变量

union 标识符
	{成员表};
union ssr
	{int i;
	 char c;
	 float f;
	 }s1,s2;

2、引用和初始化

初始化和引用同结构体。

3、注

注:另外有结构体数组、结构体指针、函数中的结构体,这里不做介绍。