0423学习总结(各种指针)

来源:互联网 发布:淘宝怎么看宝贝流量 编辑:程序博客网 时间:2024/06/13 22:43
1.数组名作为函数退化的指针
void fun(int *a)/void fun(int a[])


2.指针数组:是一个数组,数组里面保存的是指针
char *str[];


3.const关键字:
const:constant(不变)修饰变量的时候,希望将变量变成“常量”
(1)修饰变量
int const a = 12/const int a = 12
a的值的大小不能改变
(2)修饰指针
int const *p
const现在先遇到*,所以*p不能改变,但是p能重新指向另外的变量
int *const p
const现在遇到p,所以p不能指向别的变量,但是*p可以
int const *const p
第一个修饰*p,第二个修饰p,两个都不能改变
(3)const修饰的变量可以改变
例子:int const a = 12
 int *p = (int *)&a
 *p = 13
(4)const什么时候用?
修饰形参中的指针变量,也可以修饰环境中的其他变量

4.指针与数组的区别
(1)数组名表示的是数组首地址元素的地址,数组一旦被定义,分配的地址就确定,所以数组名是指针常量
(2)数组是静态分配内存空间,并且是连续的。指针是动态分配内存空间。数组的扩展性差,利用率低,造成浪费,指针则相反。
(3)数组直接访问内存,指针是间接访问内存,数组使用不灵活,比较安全,但是使用不当会出现溢出。指针使用灵活,但是使用不当会造成内存泄漏或段错误。
(4)char *str[] = "hello"
(5)数组名作为函数的参数,退化为指针处理。

5.指针与字符串
字符在c语言主要有2种处理方式
1.通过字符数组
2.通过字符指针变量指向这个字符串
char *str = “hello” //不是指hello赋值给str,而是保存在.txt
分配内存:
1..txt段分配空间保存hello
2.分配栈空间保存局部变量

6.详细介绍字符串
c语言中没有字符串这个变量,但是java中有
c语言中字符串的本质,就是指针指向头,固定尾部的地址相连的一段内存
他在内存中就是多个字节连续分布构成
三个核心:
1.指针指向头:首地址
2.固定尾部
3.各个字符的地址是连续的

强调:1.指向字符串的指针和字符串是两回事
     2.在c语言中,它没有字符常量,只有字符串常量
 
7.指针和函数
联系:1.指针指向函数
(1)定义一个函数的时候,也会给它分配一个地址
左右法则:int (*p)(int,int);
 result = (*p)(a,b)
总结:1.定义一个函数指针
 2.绑定函数指针,也就是让函数指针指向一个函数的地址
 3.调用,用*()
result = add(a,b) ==》result (*p)(a,b)
为什么要引出函数指针?主要是为了函数指针能调用不同的函数,如果只是通过函数名,只能调用一个函数
 2.函数的参数是指针变量
也就是传地址,在c语言中:传值和传址,本质上都是传值
 3.函数的返回值是指针
注意:这个地址不能是函数里局部变量的地址


8.二级指针
概念:指向指针的指针
int a=12;
int *p=&a;    //一级指针
int **pp=&p;  //二级指针

a=12=*p=**pp / p=&a=*pp / pp=&p
掌握:1.明白指向指针的指针是什么意思
 2.画个图,有助于理解
 3.推出一些公式


9.野指针和段错误
野指针:指针变量指向不确定的地址空间或者指向了一个确定的地址空间,但是引用空间的结果不可预知,这就是野指针。
危害:1.导致文件错误,其实就是地址错误
 2.没有结果,要避免
 3.发生连环错误,循环叠加

原因:1.使用指针之前,没有初始化或者没有指向确定的空间
 2.不清楚某些地址空间的访问权限,试图修改这些空间里面的值
0地址虽然存在,但是受系统保护,没有操作权限。
 3.有权限,但是超过了这个权限
 比如:访问空间的时候,内存越界会导致野指针,进而导致段错误

如何避免:1.养成良好的编码习惯,定义指针让他指向NULL
 2.使用指针之前,一定要对其初始化
 3.使用变量之前,检查指针是否为空
0 0
原创粉丝点击