avatar

目录
C语言+数据结构复习小记1

C语言+数据结构复习小记1

前言

​ 最近由于一些原因,要用到C语言,由于学习C语言是大概三年前了,后来学习了python,JS之后就很少用到C了,考研的时候由于没选择数据结构,也是没有用到C语言。C语言作为操作系统的底层语言(对于C以及Linux系统而言),以及内核级别的操作有着很大的作用,当然也被大家很多人作为第一门编程语言学习。废话不多说,特此记录一下这一段时间复习C语言,以及个人对于一些问题的见解,提出来与大家交流一下。

1.C语言基础训练

​ 由于是复习,对于基础问题我们不做深究(PS:什么主函数,什么基本输入输出库啊,包括安装),这里我们就来探讨一下当时我在第一次学习C语言的时候几个我第一次学习比较懵逼的点,这些东西有些比较抽象。(PS:当时第一次学对于* **这种调用指针的方法当时提出了自己的一些理解,但是感觉不够透彻,后来买了本汇编语言看完之后,感觉清新了不少)

1.1传值与引用调用

1.1.1传递调用

在我们应用函数的时候,我们考虑两种调用方法,一种是传值一种是引用。

c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "stdio.h"

void swap(int a,int b){

int t;
t=a;
a=b;
b=t;
printf("a is%d\n",a);
printf("b is%d\n",b);
return;


}

int main(){


int a =100;
int b =200;
printf("a is%d\n",a);
printf("b is%d\n",b);

swap(a,b);
printf("a is%d\n",a);
printf("b is%d\n",b);
}

image-20200228160909501

简单来说我们看到代码执行结果,调用函数,函数内部进行了交换,输出,在函数内部数值确实发生了变化,但是呢,主函数中的A,B值没变,到了这里,肯定有很多人摸不到头脑,这里我们站到内存的角度剖析一下。

C语言中我们学习会接触到形式参数,还有实际参数,简称形参实参。

形式参数就像名字一样是个形式,实际参数就很实际存在。

我们来看看两者的差别

image-20200228170702260

​ 如图,我们看第一张图,实际上形参只能在函数内部生效,当函数执行完毕的时候这个参数占用的内存就被收回了。当发生了函数调用,向左边一样,就会在内存中在加入一个临时占用的内存空间,然后将实参的值传递给形参,调用结束后形参消失。在这里我们理解到,实际参数必须是实际存在的,也必须是一个确切的值。当然,这个过程必须是单向的,即只能由实参传递给形参(试想形参本来就是后来出现的,是被调用函数过程中加入的),并且两者类型也必须匹配。另外实参与形参的命名是不受影响的,比如我们的例子中都叫a,b是不冲突的。

在这里我们看到这里的数值实际上是通过实际参数传递给形式参数调用的,故我们称此种调用方法为传递调用。

1.1.2 引用调用

在这里我们来介绍引用调用,这里我们要说到指针(C语言当时我学习感觉抽象的一个地方),如果你对此比较蒙,可以先跳过去,看后面我对于指针的解释再回头回顾。

我们先对上述程序进行简单修改,加入指针。

image-20200228172100529

如图所示,我们的代码执行结果,这里就变了,变成了我们在里面修改也涉及到外面的数值变化了。

那么这有什么不同于传参呢。

我们再次深入一下,从内存看,我们的代码直接调用的那一块内存,指针其实就是指向了一块内存地址,这块内存地址实际上已经被我们的实参绑定,即使我们的函数中的形参是个指针变量,但是我们操作的确实实参的内存。

举个例子来说,就相当于我有一支笔,传参就是你想要跟我这支笔一样的,于是你拿过我这只笔看了看,去买了一根跟我这个一样笔,相对于我来说,我这只笔,并没有变化,只是借给你看了一下。引用就不是这样了,就相当于你不想买,你来借用我的笔,然后你不小心把笔弄坏了,笔坏了,自然会影响到我一样。这就是两者的不同之处。

1.2 指针的二三事

1.2.1 指针的简介,指针的运算,数组指针

​ 当初刚学习C语言的时候,由于大学前没接触过计算机,很是头疼,当时上来就学C就很乱,现在回头一看,感觉甚是清晰,深入学习了一些知识,所以在这里,我们捡出来指针,来学习一下。

其实指针我们就可以理解为一个储存地址的变量,学习过微机原理汇编语言的我们知道系统的内存堆栈等信息。

我们可以利用& 来访问一个内存地址。

c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

int main ()
{
int var = 20; /* 声明一个实际变量 */
int *ip; /* 定义指针变量 */

ip = &var; /* 在指针变量中存储 var 的地址 */

printf("Address of var variable: %p\n", &var );

/* 在指针变量中存储的地址 */
printf("Address stored in ip variable: %p\n", ip );

/* 使用指针访问值 */
printf("Value of *ip variable: %d\n", *ip );

return 0;
}

我们看到 指针变量其实存储的就是一个地址的值,那么在这个内存地址中肯定要存在着内容或者为空,所以我们可以用*来访问这个内存中的内容。

其实对于当时来说这里虽然说是第一次学习,但是仔细想想想的明白,但是如果加入数组指针什么的就比较抽象了。

这里找到了一个例子,能够先帮助我们了解指向数组的指针与指针的运算。

c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

const int MAX = 3;

int main ()
{
int var[] = {10, 100, 200};
int i, *ptr;

/* 指针中的数组地址 */
ptr = var;
for ( i = 0; i < MAX; i++)
{

printf("存储地址:var[%d] = %x\n", i, ptr );
printf("存储值:var[%d] = %d\n", i, *ptr );

/* 移动到下一个位置 */
ptr++;
}
return 0;
}

image-20200229181057244

我们看到这里,每次我们的存储地址加4个字节,这个正好是我们Int型数据的大小,所以我们得知,所谓对于指针的运算就是对于内存的运算。

image-20200229182821840

我们看这张图片,说白了就是我们对于内存地址的运算,指针数组其实就是在内存里面占据了一个连续的内存地址。如果懵逼可以去了解一下汇编语言中的数据段代码段堆栈段等等,相信你会更加清晰。

1.2.2 指向指针的指针

这里我们来说一个像套娃一样的东西,指向指针的指针,对于初学者来说,如果指针那一块比较蒙圈,这里肯定也会特别蒙圈的。所以我在回顾的时候决定特别的提及一下。

image-20200229191734605

我们首先来看一下简单的描述。很简单实际上就是一个指针指向了另外一个指针的地址,而另外一个指针里面呢存储的是一个变量的地址。试想一下我们改变那个指针1的内容会发生什么?

c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>

int main ()
{
int var;
int *ptr;
int **pptr;
var = 3000;
ptr = &var;
pptr = &ptr;

/* 使用 pptr 获取值 */
printf("Value of var = %d\n", var );
printf("Value available at *ptr = %d\n", *ptr );
printf("Value available at **pptr = %d\n", **pptr);

**pptr=4000;
printf("next!!!!!!!!!!!\n");
printf("Value of var = %d\n", var );
printf("Value available at *ptr = %d\n", *ptr );
printf("Value available at **pptr = %d\n", **pptr);
return 0;
}

image-20200229210504313

我们看到后面我们修改了第一个指针的内容随即全部改变,其实就可以理解为一个链。

举一个通俗易懂的例子,还拿我的笔说(这可能是一个漂亮的笔),上次bob借走我的笔,之后bob的暗恋对象amyy看上了这只笔,bob见色起意,就没经过的同意把我的笔借给了amy,amy一不小心就把我的笔给弄坏了,然后还给了Bob,然后Bob又把我的笔还给我,但是笔到了我的手里经过amy的一番操作我的笔已经坏掉了。

这个例子中我就是那个变量,bob相当于指针2,amy相当于指针1,不知道说到这里你是不是对这个概念清晰了一点呢?

小结

​ 好了今天花了一些时间来复习了一下从前刚开始学习遇到问题的一些地方,可能会对作为初学者的你有所帮助,回头看看看来清新了不少,学知识当然要学出自己的见解最好,如果我的解释您觉得有问题,可以留言给我,我看到了会及时改正!下一节我们会深入说一下C语言甩下的尾巴以及一些数据结构的入门东西!

文章作者: 青花@Blue_And_White
文章链接: https://www.evil-qinghua.me/2020/02/28/C语言+数据结构复习小记/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 青花@Blue_And_White
打赏
  • 微信
    微信
  • 支付寶
    支付寶

评论