C语言-->(十)指针基础
知识点:
1.指针基础
2.指针和函数(地址传递)
=======================================
指针是C中的一个重要的概念,也是C的一个重要特色。掌握指针的应用,可以使程序简洁、紧凑、高效。
指针的概念比较复杂,使用也比较灵活,因此初学时会常出错,我们要理解每一个概念的本质,多加练习,在实践中掌握它。
程序使用指针和没有没有使用指针的代码是两个档次。
========================================
指针基础
【地址概念】
1.生活中地址概念和作用
(a)房屋的门牌号,通过地址找到人。
(b)程序中地址概念及作用 (内存的编号)
在程序执行过程中,所有的数据对象都存储在计算机内存储器里。
任何一个数据对象在它被执行的那段期间内都有一个确定的存储位置,占据着确定数目的存储单元。
且每个存储单元有一个唯一的编号,即地址。
2.什么是指针
由于通过地址能找到所需的存储单元,我们可以说地址指向该变量单元。在C中将地址形象的称为“指针"
1)指针的本质就是一个内存地址
3.指针作用
0)可以直接操作内存
1)使程序更加简洁高效
======================================
地址和数据
1. 常见的数据操作是数据的存储和访问, 数据可以通过变量单元存储,每个变量都有一个确定的数据类型,系统根据数据类型分配变量所占存储单元的大小。
2.变量的类型,大小,存储的值(复习)
char c;
short a;
int b;
long d;
1)如何获取变量存储空间的大小
int a;
sizeof(a) = sizeof(int);
2)如何获取存储的位置
每个变量都有相应的地址,访问变量时,系统先根据变量名查出相应的地址,然后操作地址所对应的存储单元。
&是取地址符,可以获取存储单元的地址
练习: 将变量a,b,c的地址分别打印出来(%p)。
1>scanf中的参数写法
通过变量名来访问存储单元,称为直接访问。
======================================
指针变量
一个变量的地址可以称为变量的指针,是一个十六制数值。
如果专门定义一个变量保存另一个变量的地址,则称这个变量为指针变量。
1)声明指针变量存储地址
如何声明指针变量
类型 * 变量名;
2)指针变量的本质
1>特殊的变量,本质仍然为变量
2>存放的数据为别的变量的内存地址
练习 声明一个指针变量
3)如何对指针变量进行赋值
对变通变量赋值
对指针变量赋值
//指针变量p保存变量a的地址称为 指针p指向变量a
4)如何通过指针变量访问指定内存中的内容
使用*号 是(间接访问 )
* 和&是互逆运算
5)注意内存单元地址和内存单元内容的不同!!
思考:&p ,p,*p是否为相同内容
6)练习:
1.通过指针比较整数的大小
2.通过指针交换两个变量的值
========================================
1.指针变量的深入分析
1)指针就是一个内存地址,指针变量是保存指针的一个变量,这个变量保存另一个变量的地址
2)指针变量同样有变量名,地址,大小和所存储的值
int *p;
2.各种类型的指针和大小
1)练习:1.声明指向各种类型的指针变量
char char *
short short *
int int *
long long *
2)如何获取指针变量所占内存大小
探索:1.获取其他类型指针变量的大小,查看有什么不同,并总结
mac系统是64位系统,一个指针变量,占8个字节
windows xp 是32位系统上:一个指针变量,占4个字节
==========================================
指针变量使用
1.思考:变量使用前需要注意什么问题?
p &p *p
2.指针变量使用三部曲
1)声明指针变量
2)初始化指针变量
3)通过*p访问指向的变量
3.指针的初始化
1)如果指针变量没有初始化为如何
未初始化指针称为野指针,使用指针的大忌。
2)将指针变量初始化为NULL,表示将指针悬空,指针就无法再访问任何数据。 int *p = NULL ; printf("%p,%d",p,*p);
4.如何安全的使用指针变量
使用前先判断是否为空指针,野指针为一个不确定的地址,不等于NULL
=====================================
为什么要使用指针
1.可以通过参数修改实参的值(地址传递)
2.处理字符串
=====================================
指针与函数
1.回忆函数时讲的swap函数 (值传递)
2.通过指针变量修改实参 (地址传递)
eg:一个函数可以实现两数的交换
练习:
2.编写两个函数
1) 输入的三个数返回和,最后需要将输入的内容全部设置为-1
将int a, b, c求和后输出,将a,b,c置为-1
int add(int *x, int *y, int *z)
2)实现将输入的大写字母转换为小写字母的模块
=====================================
const修饰
需求:现在项目需要对某些变量设置只读,以保护该数据不受破坏
1.const修饰普通变量的作用
2.const修饰指针的作用
1)const在*号之前,此时修饰的为*p变量,表示该变量所指向的内存区域为只读
2)const在*号之后,此时修饰的是p变量,表示该变量本身的值不允许修改
3.const修饰变量的作用和用处
1)一般出现在函数的参数列表中,以此告示调用者,函数执行过程中不会修改该参数的值
=====================================
扩展
1.如何在一行代码中同时声明多个指针变量
int a,b ,c;
//int * p,q,m;错误的写法
int * p ,* q,* m