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

时间: 2024-12-25 21:41:57

C语言-->(十)指针基础的相关文章

C语言05指针基础

1 局部变量和全局变量 1.1 问题 分别定义一个局部变量和全局变量,测试生命期限和作用域. 1.2 步骤 实现此案例需要按照如下步骤进行. 步骤一:局部变量和全局变量 代码如下所示: #include <stdio.h> /*auto*/ int x = 1000; void f1(int a) { a = 10; auto int x = 20; static int y = 30; y++; x++; printf("in f1(),a=%d,x=%d,y=%d\n"

C语言之指针基础概念

开通博客园以来第一次写随笔,就写一下关于C语言指针的一些感想吧. 很多同学都搞不懂指针,我一开始也云里雾里没看懂指针,而且老师又把指针说得很难的样子.其实主要是把指针”*“的作用给弄混了,不用畏惧,细心点看就可以了. 首先简介一下指针的概念好了.指针本身也是一个变量,只不过这个变量的值比较特殊,它不是常规的整型数或者浮点数,而是指向另一个变量地址的值.通过指针的值可以知道另一个变量的地址以及存在该地址中的具体数值(该数值可以是整型,浮点型,结构体,甚至也可以是一个指针),通过指针得到另一个变量的

十大基础实用算法之快速排序和堆排序

快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来. 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists). 算法步骤: 1 从数列中挑出一个元素,称为 "基准"(pi

黑 马 程 序 员_视频学习总结&lt;c语言&gt;----03 指针

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.什么是指针? 用来存放变量地址的变量,就称为"指针变量". 二.指针的定义 一般形式:类名标识符  *指针变量名; int *p; float *q; "*"是一个说明符,用来说明这个变量是个指针变量,是不能省略的,但它不属于变量名的一部分 前面的类型标识符表示指针变量所指向的变量的类型,而且只能指向这种类型的

十大基础实用算法之迪杰斯特拉算法、最小生成树和搜索算法

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中顶点的路径是"起点s

awk程序设计语言之-awk基础

awk程序设计语言之-awk基础 1 http://man.linuxde.net/ 2 7 8 常用工具命令之awk命令 9 awk是一种编程语言,用于在Linux/Unix下对文本和数据处理.数据可以来自标准输入(stdin).一个或多个文件,或其他命令的输出.它支持用户自定义函数和动态正则表达式 10 等先进功能,是Linux/unix下的一个强大编程工具.它在命令行中使用,但更多是作为脚本来使用,awk有很多内建功能,比如数组.函数等,这是它和c语言的相同之处,灵活性 11 是awk最大

c语言中指针悬空

Windows编程基础 创建一个Win32应用程序Ex_SDK,在程序中构造一个编辑框控件和一个按钮.编辑框用于输入一元二次方程的系数,各系数之间用逗号分隔,当单击"计算"按钮,获取方程系数,然后将求得的根通过TextOut显示在窗口客户区中. 实验准备和说明 (1)具备知识:简单的SDK编程基础. (2)准备本次上机所需要的程序. (3)创建本次实验工作文件夹"-\网络编程实验\实验1" 实验内容和步骤 1.启动Visual C++ 6.0 打开计算机,启动Vis

十大基础实用算法之归并排序和二分查找

归并排序 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 算法步骤: 1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置 3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 4. 重复步骤3直到某一指针达到序列尾 5. 将另一序列剩下的所有元素直接复制到合并序列尾 用分治策略解决问题分为三步:分解

语言的学习基础,100个经典的算法

POJ上做做ACM的题 语言的学习基础,100个经典的算法C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔 子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数 为多少? __________________________________________________________________ 程序分析:兔子的规律为数列1,1,2,3,5,8