听翁恺老师mooc笔记(4)--指针的应用场景
2017-02-22 15:06
288 查看
指针应用场景一:交换两个变量的值
在学习函数时,交换两个数的值,做一个swap函数,传递值进去,也可以将两个值交换过来,没问题,可是离开swap就没有用了,为什么?因为传进去的是两个值。
View Code
divide函数有三个参数,整数a和整数b,a除以b的结果放在第三个参数*result中,函数的返回值是如果除法是成功的,则返回值返回1,如果除数是0,让返回值为0,程序就终止不去做除法运算了产生异常返回0.在main里,如果返回值是1,条件满足打印输出abc的结果,如果返回值是0,条件不满足,不打印,因为如果除数b为0,c里是不能产生任何有意义的值。
这种场景就是函数运算可能回出错,这种错误通过另外的场景表达出来,在c语言里只能这样。在后续的C++,java语言中,采用异常机制来解决这个问题。
指针最常见的错误:
初学者在学习指针时最长犯的错误是,定义来指针变量,还没有指向任何变量,就开始使用指针。比如:
首先定义*p,*p没有指向任何一个变量,这个时候定义k,为k赋值。然后*p不是相当于一个变量吗,也为*p赋值一个值。这是不可行的,为什么?因为在定义时,*p是空的,没有指向任何一个具体的变量,没有被赋予一个实际的值,这个时候给*p赋值12,这个时候会发生的什么情况那,首先所有的本地变量都不会有默认的初始值,如果没有赋值就不会是个明确的值,可能是个乱七八糟的值,如果把这个乱七八糟的值当成一个地址的时候,p可能会指向一个莫名其妙的地方,所以当*p=12时,则就是把这个莫名其妙的地方写入12,但这个莫名其妙的地方恰巧是不可写的,这个时候程序就会崩溃。
试一下,如果int *p=0,让*p指向一个明确的不应该去的地方,这个时候程序可能就会出现一个段错误(和编译器有关),也可能编译可以过去,但是运行时结果出现问题,另外如果*p不赋值,同样可能编译能够过去,但是总有一天会出错,你不能保证*p里不指向一个不可写或者不存在的地方。这两种情况,在devc++环境下,都是编译可过,运行时出现错误:
在学习函数时,交换两个数的值,做一个swap函数,传递值进去,也可以将两个值交换过来,没问题,可是离开swap就没有用了,为什么?因为传进去的是两个值。
1 #include <stdio.h> 2 //return 如果除法成功,返回1;否则返回0 3 int divide(int a,int b,int *result); 4 5 int main(void) { 6 int a=5; 7 int b=2; 8 int c; 9 if(divide(a,b,&c)){ 10 printf("%d/%d=%d\n",a,b,c); 11 } 12 return 0; 13 } 14 15 int divide(int a,int b,int *result){ 16 int ret=1; 17 if(b==0) ret = 0; 18 else{ 19 *result=a/b; 20 } 21 return ret; 22 }
View Code
divide函数有三个参数,整数a和整数b,a除以b的结果放在第三个参数*result中,函数的返回值是如果除法是成功的,则返回值返回1,如果除数是0,让返回值为0,程序就终止不去做除法运算了产生异常返回0.在main里,如果返回值是1,条件满足打印输出abc的结果,如果返回值是0,条件不满足,不打印,因为如果除数b为0,c里是不能产生任何有意义的值。
这种场景就是函数运算可能回出错,这种错误通过另外的场景表达出来,在c语言里只能这样。在后续的C++,java语言中,采用异常机制来解决这个问题。
指针最常见的错误:
初学者在学习指针时最长犯的错误是,定义来指针变量,还没有指向任何变量,就开始使用指针。比如:
int *p; int k; k=12; *p=12;
首先定义*p,*p没有指向任何一个变量,这个时候定义k,为k赋值。然后*p不是相当于一个变量吗,也为*p赋值一个值。这是不可行的,为什么?因为在定义时,*p是空的,没有指向任何一个具体的变量,没有被赋予一个实际的值,这个时候给*p赋值12,这个时候会发生的什么情况那,首先所有的本地变量都不会有默认的初始值,如果没有赋值就不会是个明确的值,可能是个乱七八糟的值,如果把这个乱七八糟的值当成一个地址的时候,p可能会指向一个莫名其妙的地方,所以当*p=12时,则就是把这个莫名其妙的地方写入12,但这个莫名其妙的地方恰巧是不可写的,这个时候程序就会崩溃。
试一下,如果int *p=0,让*p指向一个明确的不应该去的地方,这个时候程序可能就会出现一个段错误(和编译器有关),也可能编译可以过去,但是运行时结果出现问题,另外如果*p不赋值,同样可能编译能够过去,但是总有一天会出错,你不能保证*p里不指向一个不可写或者不存在的地方。这两种情况,在devc++环境下,都是编译可过,运行时出现错误:
相关文章推荐
- 听翁恺老师mooc笔记(5)--指针与数组
- 听翁恺老师mooc笔记(3)--指针的定义
- 听翁恺老师mooc笔记(6)--指针运算
- Perl笔记 硬引用(指针)的创建和应用场景
- 听翁恺老师mooc笔记(9)--枚举
- 听翁恺老师mooc笔记(7)--字符串1
- 听翁恺老师mooc笔记(15)--文件的输入与输出
- 听翁恺老师mooc笔记(11)--结构和函数
- 听翁恺老师mooc笔记(2)-第一个程序--&运算符
- 听翁恺老师mooc笔记(8)--字符串2
- 听翁恺老师mooc笔记(13)--类型定义和联合
- 听翁恺老师mooc笔记(14)--格式化的输入与输出
- 听翁恺老师mooc笔记(12)--结构中的结构
- 听翁恺老师mooc笔记(10)--结构
- 听翁恺老师mooc笔记(1)--为何选择学习C
- 听翁恺老师mooc笔记(16)--程序设计与C语言
- Unity3D自学笔记——架构应用(五)Loading场景及持久化场景
- Salesforce开发者学习笔记之二:Salesforce开发平台应用场景
- 中国大学MOOC_C语言程序设计(翁恺)笔记
- Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》