知识点:
• 指针与变量 (指向变量的指针)
• 指针与函数 (地址传递)
• 指针与数组 (指向数组的指针)
• 指针与字符串
=================================
数组的指针
1.什么是数组指针
1)数组的指针是指数组在内存的的起始位置
2)数组的第一个元素和数组的起始地址一致
2.数组名的本质
1)数组名本质上是一个地址常量,代表的是数组的首地址也就是第一个元素的地址
数组名表示表示数组的起始地址,不表示整个数组,不能对数组整体赋值。
3.数组名为一个指针常量,可以当作一个指针来使用
有起始地址和下标可以计算对应的元素地址
4.数组的另外一种访问方式
eg:
1)回忆数组的下标访问特定元素
2)如何通过指针方式打印指定元素
3.交换第一个元素和最后一个元素的值
练习:
1.通过循环遍历出所有的元素
2.通过scanf对所有元素进行赋值
==============================
指向数组的 指针变量
1.什么是指向数组的指针
保存数组地址的指针变量
2.声明方式
1)指向一维数组的指针
3.指向数组的指针变量本质
1>本质仍然为一个变量,保存一个变量的指针,只不过现在保存的是一个数组的首地址
4 .如何通过指向数组的指针变量来操作数组
1)如何获取元素
1>两种方式:下标法,指针运算法
下标法:和数组使用方式一样,着重了解指针和数组的操作类似
指针运算法:通过对首地址的偏移实现
5.指针运算
指针变量和普通变量一样可以执行+-*/四则运算,+-表示所指向的位置向左右移动,*/没有意义。
1).指针变量的加减操作
思考:指针+1后加了多少
练习:声明一个指向char的指针,输出+1后的地址
2).思考:*(p+1)和*p+1的区别
3).指针的关系运算
4).思考:
指向数组的指针的算术运算才有意义表示什么? 单独的指针运算是否有意义?
5).数组名和指针变量的区别
1>数组的名称是数组的首地址,一旦数组确立,其地址是固定不变的
2>指针变量则是一个拥有内存空间的变量,可以反复赋值
可以通过数组指针++ -- 偏移指向数组的指针变量遍历数组
练习:
1.通过指向数组的指针完成元素的遍历(两种方式都要) 5
2.通过scanf对所有的元素进行赋值操作
3.通过指向数组的指针计算数组所有元素的和
6.作用
1)指向数组的指针一般出现在函数参数中,用来表示接收数组实参数
==============================
数组参数
实现一个遍历数组的函数模块
1.数组参数的表示方式
sizeof(a)/sizeof(a[0])
1)普通数组的形式func(int a[5]); // func(int a[]);
2)指针的形式 func(int *a)
2.思考:能否直接在函数内求出数组的大小,如果不能,请说明
func(int a[5]);
3.数组作为参数传递
1)本质
当数组作为参数传递时,是以地址方式进行传递
思考:地址传递意味这什么?
2)原因
减少无用的数据拷贝
3)完整的参数列表
1>要接收的数组类型
2>接收数组的长度大小,这个必须由调用者传递
练习:
1.设计一个函数,将一个数组的内容填写至另一个数组
void copy_arr(int *a1, int *a2, int len); 5
以下练习均以指针操作
============================
指针与字符串
1>如何通过指针变量引用一个字符串
2>通过此种引用方式的特点
1.指向字符数组的指针
1)指向一个字符数组
练习:以下练习均以指针完成
1>编写一个函数,使用指针将字符串中的大写改为小写
2>编写一个函数,使用指针统计字符个数
2.指针指向的字符串
2)字符串常量
1>能否直接修改元素的内容
2>修改后的结果
3>本质:指针直接引用的字符串为一个常量,称为字符串常量