Day11 笔记
1,指针
指针是C语言的灵魂
1),理解变量的值,变量的地址
2),指针:变量的地址,指针就是地址,地址就是指针
2,指针变量
1),首先是个变量,专门存储地址的
所以指针变量中是存储了另一个指针变量的地址
我们说 指针变量 只想了这个变量
2),作用? 多了一种变量的访问方式
int num = 10;
num = 20; 直接访问
int num = 10;
int *p1 = # 间接访问
3),数据类型 *指针变量名
int *p1; 这个时候声明了一个指针变量,名字叫做p1 而不是*p1
*代表声明的变量不是一个普通类型的变量,而是一个指针变量
4),一个指针变量虽然是专门用来存储地址的,但是并不是什么地址都可以存。
一个指针变量能够存储什么样的地址,和指针的类型相同的变量的地址。
int *p1; 这个时候p1指针变量智能存储int类型变量的地址
float * p2;这个时候p2指针变量职能存储float类型变量的地址
5),指针变量 是一个变量
所以命名规则规范要符合之前的要求
一般情况下 指针变量用p开头 一看就知道是一个指针
也可以批量声明; int *p1,*p2,*p3;
注意每一个指针变量都要加 *
4,指针变量的初始化
1),特点:专门存储地址,不能直接赋值常量和变量的值
2),int *p1;
声明了一个int *类型的变量叫做p1 不叫*p1
p1的类型是 int* 读作 int指针
3),赋值: int * p1;
p1 = #
输出 指针变量 使用 %p 格式控制符
4),注意:指针变量只能存储和这个指针类型相同的变量的地址 否则有问题
5,指针变量的使用
1),通过指针间接访问指向的变量
语法: *指针变量名
int num = 10;
int *p1 = #
num = 20; 直接访问
*p1 = 20; 简介访问
(*p1 代表所指向的变量 即num)
2),p1 代表指针变量 存的是地址
*p1 代表所指向的变量 存的是数据
6,指针使用 注意三点
1),野指针
声明指针变量的时候没有初始化 有一个垃圾值 (随即值)
有可能别的程序正在使用,系统正在使用
如果取值,问题不大
如果修改,相当危险
所以,不要去操作野指针
2),NULL值
操作野指针很危险
所以声明指针变量时最好初始化
如果暂时不清楚指针变量指向的空间 可以先赋给NULL
NULL代表不指向任何内存空间
int *p1 = NULL; 不指向任何内存空间
这个时候,如果通过p1访问指向的变量 就会出错
NULL 与 0 时等价的
int * p1 = 0 ; 也可以
这个时候 0不代表整数的0 而是代表不指向任何内存地址
3),多个指针可以指向同一个变量
通过任何一个指针操作变量都会改变这个内存地址中的数据
7,指针作为函数的参数
指针变量的作用
不仅仅是间接访问
但函数的参数是一个指针的时候
在函数的内部去访问一个变量 其实访问的是实参
这是地址传递 而不是值传递
8,什么时候用指针作为函数的参数
1),函数的内部希望可以去修改调用着的实参变量的值
那么就可以将指针作为函数的参数,在传值时,讲调用着的变量的地址传入
这个时候,函数内部就可以通过参数指针修改实参变量的值
2),函数只能有一个返回值
那么函数讲一个返回值指针变量做参数,在函数中修改所指的变量
可以达到返回的效果
函数的参数定义为指针,要求调用者传入自己变量的地址
函数内部将需要返回的数据直接通过指针赋值给调用着的变量
|
|