目录

前言:

(1)内存是如何编址的?

(2)如何对变量进行寻址?

直接寻址:直接到变量名标识的存储单元读取变量的值——&

间接寻址:通过存放变量地址的其他变量访问该变量(通过其他变量间接找到变量的地址读取变量的值——*)

关于直接寻址的两个问题:

(3)用什么类型的变量来存放变量的地址?——指针类型

(4)指针究竟指向了哪里?——指针变量初始化

未初始化带来的危害:

(5)空指针:

(6)指针变量与变量的地址的区别:

(7)如何访问指针指向的存储单元中的数据?

(8)指针的简单使用

典型实列:两数互换

(9)什么是函数指针?

定义函数指针常见错误:

(10)函数指针的应用:

(11)总结:


前言:

强转与指针,并称C语言的两大神器,用好了可呼风唤雨,威力无比,用不好也会伤及自身
理解指针要从变量的地址谈起

(1)内存是如何编址的?

  • 内存中的每个字节都有唯一的编号(地址)(如同街道的门牌号),内存地址按字节编号,其字长一般与主机相同, 32位机使用32位地址,最多支持232字节内存(4G )
  • 地址是一个无符号整数,从0开始,依次递增。在表达和交流时,通常把地址写成十六进制数

 (2)如何对变量进行寻址?

  • 直接寻址:直接到变量名标识的存储单元读取变量的值——&

  • 间接寻址:通过存放变量地址的其他变量访问该变量(通过其他变量间接找到变量的地址读取变量的值——*)

  • 关于直接寻址的两个问题:

问题一、
int i;
scanf("%d", i); /* 这样会如何?*/

i 的值被当作地址。如i值为100,则输入的整数就会从地址100开始写入内存 

问题二
char c;
scanf("%d", &c); /* 这样呢?*/

输入数据以int的二进制形式写到c所在的内存空间。c所占内存不足以放下一个int,其后的空间也被覆盖

 (3)用什么类型的变量来存放变量的地址?——指针类型

  • 指针类型为4个字节大小 
  •  指针变量:具有指针类型的变量
  • 指针变量基类型:指针变量指向的数据类型,称为基类型(指针变量只能指向同一基类型的变量,否侧会引起warning)
int *pa;//定义的一个可以指向整型数据的指针变量//*号:表示pa是一个整型指针变量
//定义之后就可以用它保存一个整型变量的地址了
//告诉编译器,pa是一个指针变量,占4字节内存,需要用一个int型变量的地址给它赋值,

(4)指针究竟指向了哪里?——指针变量初始化

  • 使其具体的指向某一个变量
int *pa = &a;//指针变量初始化 //等价于int *pa;pa=&a

未初始化带来的危害:

  • 指针变量未被初始化,意味着指针变量的值是一个随机值,我们无法预知它会指向哪里,它很可能会乱指一气。使未初始化的指针变量是初学者常犯的错误,其带来的错误隐患是非常严重的。在不确定指针变量究竟指向哪里(也许是一个只读的或者不可访问的存储区,例如待执行的机器指令所在的代码段)的情况下,就对指针变量所指的内存单元,进行写操作,将会给系统带来潜在的危险,严重时还会导致系统崩溃
  • 如果你不知把它指向哪里,那就指向NULL
    int  a = 0, b = 1;char c = 'A';int *pa = NULL, *pb = NULL; char *pc = NULL;

(5)空指针: 

空指针:值为NULL的指针,即无效指针
既然0(NULL)用来表示空指针,那么空指针就是指向地址为0的单元的指针吗?
答案:不一定
  • Þ每个C编译器都被允许用不同的方式来表示空指针
  • Þ并非所有编译器都使用0地址
  • Þ某些编译器为空指针使用不存在的内存地址
  • Þ硬件会检查出这种试图通过空指针访问内存的方式

(6)指针变量与变量的地址的区别:

(7)如何访问指针指向的存储单元中的数据?

——指针的解引用:引用指针指向的变量的值,修改指针变量pa所指向的变量的值(修改存储单元中的数据)

 (8)指针的简单使用

典型实列:两数互换

  • 按值调用:普通变量作函数参数—按值调用 实参的值不随形参值的改变而改变
  • 按地址调用:指针做函数参数—按地址调用 为了在被调函数中修改其无法直接访问的实参的值

 

 注意:某些编译器检查实参和形参的数据类型是否匹配,不匹配则给出警告;另一些编译器直接将实参的值当作地址值,产生非法内存访问,导致程序异常终止

(9)什么是函数指针?

函数指针就是指向函数的指针变量,指向函数的指针变量中存储的是一个函数在内存中的入口地址

通过前面的学习可以知道:一个数组名其实就是存储数组第一个元素的内存地址。同理,一个函数名就是这个函数的源代码在内存中的起始地址

定义格式:数据类型(*指针变量名)(形参列表);

列如:若有函数原型为:int Fun (int a , int b);

           则可定义函数指针: int  (*f) (int,int)  ;  令f=Fun;就是让f指向函数Fun()

——编译器将不带()的函数名解释为该函数的入口地址

——函数指针变量存储的是函数在内存中的入口地址

定义函数指针常见错误: 

(10)函数指针的应用:

实列一:编写通用性更强的函数

 典型实列二:编写通用的排序函数——编写实现升序和降序排序

 (11)总结:

——指针变量 :

  •  –指针类型的变量,保存地址型数据

——指针变量与其他类型变量的共性:

  • –在内存中占据一定大小的存储单元(通常4个字节)
  • –先定义,后使用

——特殊性

  • –指针变量中保存的内容只能是地址(变量或函数的地址)
  • –必须初始化后才能使用,否则指向不确定的存储单元
  • –只能指向同一基类型的变量
  • –可参与的运算:加、减整数,自增、自减、关系、赋值

——指针变量

  • 定义不同基类型的指针,是明确指针指向单元的内容是什么
  • 初始化的目的,是明确指针指向了哪里

——使用指针变量的基本原则

  • 明确指针指向了哪里
  • 明确指针指向单元的内容是什么
  • 永远不要使用未初始化的指针变量
  • 一个(xx型)的指针指向一个(xx型)的变量

——指针的一个重要应用之一

  • 作函数参数,向函数传递变量或函数的地址

——指向变量的指针,作函数参数

  • 按地址调用,传递变量在内存中的地址(用取地址运算符)
  • 被调函数根据该地址读写它不能直接访问的变量的值(用间接寻址运算符,指针的解引用)

——指向函数的指针,作函数参数

  • 按地址调用,传递函数在内存中的入口地址(函数名)
  • 被调函数根据传入的不同地址调用不同的函数

C语言指针——基础知识理解相关推荐

  1. c语言中字符指针变量输入,C语言指针基础知识实例讲解

    对程序进行编译的时候,系统会把变量分配在内存单位中,根据不同的变量类型,分配不同的字节大小.比如int整型变量分配4个字节,char字符型变量分配1个字节等等.被分配在内存的变量,可以通过地址去找到, ...

  2. C++:C++语言入门级基础知识考察点回顾之数组、指针

    C++:C++语言入门级基础知识考察点回顾之数组.指针 目录 C++的数组.字符串 1.数组 1.1.声明数组 1.2.一维数组的应

  3. C语言 文件基础知识整理

    C语言文件基础知识 之前学C语言的时候老师讲文件讲的相当潦草,因为大作业的关系现在只能自己重听自学一遍.以下是根据北理工的C语言程序设计mooc的文件单元课件和上课时的补充内容所整理的C语言文件基础知 ...

  4. 计算机二级C语言辅导j机构,全国计算机二级C语言公基础知识辅导.pptx

    全国计算机二级C语言公基础知识辅导 ;知识点分布;第一章 数据结构与算法;1.算法是指解题方案的准确而完整的描述.换句话说,算法是对特定问题求解步骤的一种描述. *算法不等于程序,也不等于计算方法. ...

  5. 二级c语言基础知识pdf下载,全国计算机等级考试二级C语言公共基础知识.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp资格/认证考试&nbsp>&nbsp计算机等级考试 全国计算机等级考试二级C语言公共基础知识 ...

  6. C语言2011计算机二级c语言考点:c语言的基础知识

    实验二c语言的基础知识 C语言[目的与要求] 1. 掌握c语言数据类型, 熟悉如何定义一个整型.字符型.实型变量, 以及对它们赋值的方法, 理解以上类型数据输出时所用的格式转换符. 2. 学会运用c的 ...

  7. 计算机二级考试c语言公共基础知识,全国计算机二级c语言公共基础知识考试内容.doc...

    全国计算机二级c语言公共基础知识考试内容 全国计算机二级等级考试的笔试包括基础知识和程序设计两部分,其中基础知识占30分.以下是由关于全国计算机二级c语言公共基础知识考试内容的内容,希望大家喜欢! 全 ...

  8. 计算机二级c语言公共基础知识(免费的) 百度云,计算机二级c语言公共基础知识(免费的).doc...

    计算机二级c语言公共基础知识(免费的).doc 计算机二级C语言的二级共公基础知识教程 第一章数据结构与算法 1.1 算法 算法:是指解题方案的准确而完整的描述. 算法不等于程序,也不等计算机方法,程 ...

  9. 2011计算机等级考试二级c语言公共基础教程.doc,2011年全国计算机等级考试二级c语言公共基础知识复习100题及答案.doc...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp资格/认证考试&nbsp>&nbsp计算机等级考试 2011年全国计算机等级考试二级c语言公 ...

最新文章

  1. 硅谷风投押注计算机网络安全市场
  2. php程序的安全要素
  3. linux客户端设置eth0为dhcp,如何设置Linux客户端以使用通过dhcp提供的ntp信息?
  4. iOS开发之Masonry框架-源码解析
  5. 大整数减法c语言_C语言学习笔记(一)
  6. BZOJ4327 : JSOI2012 玄武密码
  7. 用户体验分析: 以 “南通市图书馆微信公众号” 为例
  8. python中与label类似的控件是_Python高级进阶教程021期 pyqt5label控件进阶使用,设置兄弟控件,广告植入...
  9. Java 12 - Java StringBuffer和StringBuilder类
  10. 网页控制台调用click()失败_C# 调用百度AI 人脸识别
  11. 【回文串5 重点+动态规划】LeetCode 132. Palindrome Partitioning II
  12. hive中的集合操作函数
  13. Stream上传插件(Java接口实现)
  14. widthStep、width
  15. 如何找到局域网内所有主机ip
  16. mysql data目录 恢复_利用mysql data文件夹恢复数据
  17. c语言怎么写注释,C语言注释
  18. 一些相似单词的区别之处
  19. 20145234黄斐《信息安全系统设计基础》第三周学习总结
  20. Java带GUI求柱体的体积

热门文章

  1. 视频跟踪——CMT算法
  2. AttributeError : module ‘enum‘ has no attribute ‘IntFlag‘
  3. 华科10年保送生计算机考研复试机试
  4. 草稿 断开绑dgv1
  5. 演练 制作爱奇异视频播放列表 0929
  6. javascript 西瓜一期 09 字符与编码的对应关系 理解
  7. 记一次mysql进程无法启动的解决方案
  8. python使用print语句时显示特殊字符
  9. 如何避免程序员和产品经理打架?“微服务”或将成终极解决方案
  10. C++中 return,break,continue的用法