目录
前言:
1.函数
2.指针
3.易错点
4.思维导图
函数就像一个“有魔法的加工盒”,你从入口丢一些原材料进去,它就能加工出一个成品。不同的函数能加工出不同的成品。
入口丢进去的瓶子,水和标签就是输入,出口出来的瓶装水就是输出,“有魔法的加工盒”就是函数。
不同的函数有不同的功能,就像有些“加工盒”加工出来的水是矿泉水,有些“加工盒”加工出来的“水”是果汁。
1.1
函数主要分为两大部分:
第一部分是函数定义,第二部分是函数调用。
函数的定义主要是约定了函数的使用方式和功能。包括了:返回值,函数名,函数参数和函数体。
函数的调用主要是主干代码对函数的使用,来实现代码的功能,调用通过函数名加函数参数实现。
1.2
我们来重温一下函数的定义和调用:
int AddThree(int num_a)
{
int num_b;
num_b = num_a + 3;
return num_b;
}
1.函数的定义部分
int main()
{
int num_c = 10;
int num_d;
num_d = AddThree(num_c);
printf("%d\n", num_d);
}
2.函数的调用部分
函数名我们鼓励的风格是单词首字母大写,比如AddThreeNumber
,不鼓励的风格add_three_number()
。
1.3
我们学习的函数定义和函数调用,主要针对的是自定义函数的写法。
对于编程语言的内置函数,我们一般只需要了解它的调用方法就可以了。
自定义函数的功能是我们自己定义的,对我们写程序的人来说,它是一个透明的白盒。
也就是说,你不仅知道这个函数的功能是什么,也知道函数内部具体的代码细节是什么样子的。
“内置函数”是C语言自带的,它是一个不透明的黑盒。也就是说,我们可以直接调用这些函数,但是不用关心函数内部的代码细节。
1.4
函数机制的设计目的有两个:
第一个是可复用。写一次代码,可重复使用,从而节省写代码的成本;
时间成本也是成本~
第二个是屏蔽功能实现的细节,用户只需要知道输入和输出就可以了,方便组合代码——这种思想叫封装,在后面的代码学习之路上我们还能接着看见。
2.1
指针就是内存地址,内存地址就是指针
内存地址是计算机底层的一种数据存储机制,对内存地址的直接操作,等同于对原始数据的直接操作。
因为指针变量本身存储的是一个内存地址,因此我们要获取这个指针指向的变量数据的时候,需要使用指针运算符*
。
而变量存储的是一个数据,因此我们要获得这个变量数据的内存地址时候,需要使用取地址运算符&
。
2.2
例如:
int num_a = 1;
1.定义一个整型变量num_a
int num_a = 1;
int *p1;
2.定义一个整型指针p1
nt num_a = 1;
int *p1;
p1 = &num_a;
3.把变量的内存地址赋给指针
int num_a = 1;
int *p1;
p1 = &num_a;
printf("%d\n", *p1);
4.打印指针p1指向的数值,1
int num_a = 1;
int *p1;
p1 = &num_a;
printf("%d\n", *p1);
*p1 = 2
5.给指针p1指向的值重新赋值
int num_a = 1;
int *p1;
p1 = &num_a;
printf("%d\n", *p1);
*p1 = 2;
printf("%d\n", *p1);
6.再次打印指针p1指向的数值,2
2.3
指针一旦赋予了某个变量的内存地址,他们就关联起来了,改变任意一方的值,另一方也会随之改变,因为他们共享同一个内存地址。
同样的道理,我们也可以使用指针来参与各种运算,比如四则运算,比较运算,逻辑运算等等。
2.4
同时我们也学习了指针和数组的关系,指针可以指向数组的单个元素的内存地址;
同时指针也可以指向一个数组名,因为数组本质上就是一个指针,数组名存储的也是一个内存地址。
2.5
int num_list[5] = {0, 1, 2, 3, 4};
int *p1;
p1 = &num_list[2];
printf("%d\n", *p1);
p1 = num_list;
printf("%d\n", *p1);
1.指向数组的第三个元素
p1 = &num_list[2];
2.打印数组的第三个元素
printf("%d\n", *p1);
3.把数组名存储的内存地址赋值给p1
p1 = num_list;
4.打印数组的第一个元素
printf("%d\n", *p1);
2.6
当指针指向一个数组元素的时候,它只是和这个数组元素发生了关联,共享了这个数组元素的内存地址。
当指针指向一个数组的时候,它和整个数组发生了关联。
由于数组本质上是一个指针,所以*(p+1)
和num_list[1]
是等价的,都指向同一个内存地址。
2.7
我们还学习了指针作为函数参数时候的用法,这时候的核心是任何对这个指针参数的修改,都会修改到原来的数据。
这是因为当我们使用一般的变量做为函数参数的时候,传入函数的是一个数据的复制品;
而我们使用指针作为函数参数的时候,传入函数的是一个内存地址,对内存地址里面的数据进行修改的时候,修改的是原始数据。
1.用void
关键字定义无返回值函数
2.函数返回值的数据类型,和函数定义里面写的数据类型需要保持一致,否则程序会报错
3.指针指向的是变量的内存地址
4.数组本质上也是一个指针
5.当指针指向整个数组时,不需要到取地址运算符&
;
但是指针指向数组的某个具体元素时,要用到取地址运算符&
最后我想说的是:
在撰写这篇文章时,我参考了《白纸编程》这个app的观点和思想,我要感谢他们对我的启发和帮助。