C语言入门Day_25 函数与指针小结

目录

前言:

1.函数

2.指针 

3.易错点

4.思维导图


前言:

 函数就像一个“有魔法的加工盒”,你从入口丢一些原材料进去,它就能加工出一个成品。不同的函数能加工出不同的成品。

入口丢进去的瓶子水和标签就是输入,出口出来的瓶装水就是输出,“有魔法的加工盒”就是函数。 

不同的函数有不同的功能,就像有些“加工盒”加工出来的水是矿泉水,有些“加工盒”加工出来的“水”是果汁。

1.函数

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.指针 

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

我们还学习了指针作为函数参数时候的用法,这时候的核心是任何对这个指针参数的修改,都会修改到原来的数据

这是因为当我们使用一般的变量做为函数参数的时候,传入函数的是一个数据的复制品

而我们使用指针作为函数参数的时候,传入函数的是一个内存地址,对内存地址里面的数据进行修改的时候,修改的是原始数据

3.易错点

1.用void关键字定义无返回值函数

2.函数返回值的数据类型,和函数定义里面写的数据类型需要保持一致,否则程序会报错

3.指针指向的是变量的内存地址

4.数组本质上也是一个指针

5.当指针指向整个数组时,不需要到取地址运算符&

但是指针指向数组的某个具体元素时,要用到取地址运算符&

4.思维导图

最后我想说的是:

 在撰写这篇文章时,我参考了《白纸编程》这个app的观点和思想,我要感谢他们对我的启发和帮助。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值