C语言——变量和指针

C语言——变量和指针

这里引用韦东山老师的两句话:

  • 变量变量,能变,就是能读能写,必定在内存里
  • 指针指针,保存的是地址,32位处理器中地址都是32位的,无论是什么类型的指针变量,都是4字节

1、什么是内存
能读又能写的才叫内存,以下图单片机的机构图为例,RAM就是内存

在这里插入图片描述

2、 讨论变量在内存中的大小
普通定义的变量例如int、char这种类型没有有疑问的地方,重点理解一下指针变量,对于32位处理器,指针变量都是占4个字节。所以不管是下图中哪种变量指针都是占用4字节空间

在这里插入图片描述

3、关键字const
变量在使用const 修饰过后就成了常量了,会存在Flash中节省内存,有时候也会被编译器优化直接就存在内存中了

4、 关于指针变量计算大小,使用sizeof()函数
普通变量-》int a;计算的话就是sizeof(a)结果是=4
指针变量-》int *a;计算的话就是sizeof(a)结果是=4(注意不是sizeof(*a)),sizeof(*a)是计算int这种类型的大小
指针变量-》char *a;计算的话就是sizeof(a)结果是=4(注意不是sizeof(*a)),sizeof(*a)是计算char这种类型的大小结果=1

在这里插入图片描述

5、关键字volatile,限定变量在执行操作的时候,每次都要操作内存

  • 比如下图中在变量i在执行++操作的时候,不会被优化为只有cpu就把i++操作了,而是每次执行i++都要读写内存
  • 在操作寄存时更是如此,必须要加volatile

在这里插入图片描述

6、关键字static,限定作用空间的
关键点是函数或者是变量的作用域,强龙不压地头蛇
不带static的话就表示作用于是全局的

在这里插入图片描述

7、关键字extern,用来修饰该变量是在其他外部其他文件中定义的
只能用来声明变量
错误示例:extern int num= 2;
正确写法:extern int num;

在这里插入图片描述

8、结构体struct,是认为新定义的一种变量
了解字节对齐和结构图占用内存空间大小的问题

在这里插入图片描述

9、结构体指针

在这里插入图片描述

10、链表的操作
举例:间谍的线人,A的下线是B,B的下线是A
初始化:
p_spy head = NULL;
head = &A;
A.next = &B;
B.next = &C;
C.next = NULL;
使用:
打印各个间谍的名字

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

11、链表的操作-插入操作
主要内容就是指针的操作
注意:链表最后一项的next=NULL

typedef struct spy {
	char *name;
	struct spy *next;
}spy, *p_spy;  //间谍的结构体

spy A = {"A", NULL};
spy B = {"B", NULL};
spy C = {"C", NULL};
spy D = {"D", NULL};

p_spy head = NULL;  //初始化头部

void insert_spy(p_spy newspy)  //插入操作
{
	p_spy last;
	
	if (head == NULL)
	{
		head = newspy;
		newspy->next = NULL;
	}
	else
	{
		/* 先找到链表的最后一项 last */
		last = head;
		while (last)
		{
			if (last->next == NULL) /* 找到了 */
				break;
			else
				last = last->next;
		}
		
		/*  */
		last->next = newspy;
		newspy->next = NULL;
	}
}

int main( void )
{
	insert_spy(&A);	//插入A
	insert_spy(&B);	
	insert_spy(&C);	
	insert_spy(&D);	
	
	head = &A;
	
	while (head)
	{
		printf("%s\r\n", head->name);  //打印各个间谍信息
		head = head->next;
	}

	while (1);
	return 0;
}

12、链表的操作-删除
主要就是要找到待删除元素的上一项

void remove_spy(p_spy oldspy)  //删除操作
{
	p_spy left;
	
	if (head == oldspy)
	{
		head = oldspy->next;
	}
	else
	{
		/* 找出oldspy的上线 */
		left = head;
		while (left)
		{
			if (left->next == oldspy)
				break;
			else
				left = left->next;
		}
		
		if (left)
		{
			left->next = oldspy->next;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值