C语言第八讲,指针*
C语言第八讲,指针*
一丶简单理解指针
说到指针,很多人都说是C语言的重点. 也说是C语言的难点.
其实指针并不是难.而是很多人搞不清地址 和 值.以及指针类型.
为什么这样说.
假设有两个变量,如下
int nNum1 = ;
int nNum2 = 0x00401000;
变量nNum1 保存的值是1
变量nNum2 保存的是一个16进制数值.
那么如果我们把保存16进制的这个变量.当作指针. 也就是说它保存了一个16进制数值而已. 我们可以通过16进制找到里面存储的值.
但是因为是保存地址的变量.所以我们需要加上特殊符号进行定义.
例如:
int *nNum2 = 0x004010000;
指针其实就是保存了一个特殊的数值而已. 而通常这个数值我们说是地址.

如果我们保存了1的地址,那么我们就可以访问1了.
怎么访问?
可以通过取内容符号进行访问.
int nNum = ;
int *p = &nNum1; //保存1的地址,我们可以不用管.也可以理解为一个16进制数值而已.
*p = ; //修改地址空间的值.
二丶指针的数据类型
说到指针.其实我们说的并不是保存地址的难点.难点是该如何解释这个地址.
例如我们知道定义一个变量.我们可以知道这个变量的内存空间跟随这数据类型走.
例如:
int nNum1 = ; //nNum1 大小是4个字节. 则 sizeof(nNum1) = 4;
short int nNum2 = ; // nNum2 大小是2个字节. 则sizeof(nNum2) = 2;
....
那么我们指针其实也一样.也和普通变量一样.
int nNum1 = ;
int *p = &nNum1; p的大小也是4个字节. 跟地址无关.
比如我们定义指针的是否有很多数据类型解释.
例如:
int *p; short *p; double *p;
那么地址解释的方式也就不一样.

根据上图可以得知,1所占的内存空间是4个字节,而不同的类型则有不同的解释方式.
如果解释为short *,则获得的是1的高位,如果解释为int *则是整个的1所代表的值.
三丶指针的运算
指针和我们普通变量运算不一样.
普通变量进行运算
int nNum1 = ;
nNum1 ++; //nNum1 = 2;
指针变量进行运算
int *p = 0x00401000;
p++; 则P的值是0x00401004;
因为我们的类型是 int *解释方式,所以每次+1则是加一个int类型大小.而因为指针就是地址.
所以+1的时候就是+
指针相减也是一样的.
四丶指针和数组的的组合
学习了指针,就要说下指针应用的场合. 数组和指针一般是很常见的.
例如定义数组:
int nNum1[] = {,,,,,,,,,};
指针可以进行访问数组.
int *p = nNum1; //注意,数组是一个数据结构.所以我们不用加取地址符号.数组名就是数组的首地址.
如果我们是变量,则需要加上&符号.
例如:
int n = ;
int *p = &n;
指针进行访问:
*p = ; //数组元素的第一项更改为10
p++; //指针++,根据数据类型来相加,+1等于+4,则到数组的第二个元素了.
一般遍历数组的时候我们会封装成一个函数.
则会写成下面这样.
void IteratorArr(int *p, int Count)
{
while (Count--) //遍历的个数自减
{
printf("%d \t",*p);
p++; //数组元素自加
}
puts("\r\n");
}
int main()
{
int Arr[] = { ,,,,,,,,, };
IteratorArr(Arr,sizeof(Arr)/sizeof(Arr[]));//传入数组首地址即可.但是我们函数的参数要定义为指针. 还需要传入数组的个数.进行遍历.
system("pause");
return ;
}
输出结果.

五丶指针和函数的应用.
指针一般也用于函数的传参.例如上面我们遍历数组.其中我们的函数的形参就是指针.
如果在函数中想更改实际参数的值. 也可以用到指针.例如我们上一篇讲解函数的时候留下的一个小话题.
void ChangeValue(int *p, int *p1)
{
*p = ; //传过来的是nNum1的地址,所以我们直接*地址对其更改即可.
*p1 = ;
}
int main()
{
int nNum1 = ;
int nNum2 = ;
ChangeValue(&nNum1,&nNum2);
printf("nNum1 = %d nNum2 = %d\r\n",nNum1,nNum2);
system("pause");
return ;
}
输出结果.

函数指针.
指针的高级应用还有函数指针. 就是我们定义一个指针. 这个指针是函数指针.可以指向自己定义的一个函数.
函数名字就是函数的首地址.
例如:
void ChangeValue(int *p, int *p1)
{
*p = ;
*p1 = ;
}
int main()
{
int nNum1 = ;
int nNum2 = ;
ChangeValue(&nNum1,&nNum2); int(*p)(char const* const _Format, ...); //定义函数指针
p = printf; //函数指针p指向了printf
p("nNum1 = %d nNum2 = %d\r\n",nNum1,nNum2); //调用p实际和调用printf一样
system("pause");
return ;
}
输出结果.

函数指针的语法
函数返回值 (* 指针变量名)(函数参数)
函数指针其实很好定义,只需要把函数的声明拿过来,然后函数名字前边加上括号. 括号里面加上*就可以了.
C语言第八讲,指针*的更多相关文章
- 函数指针玩得不熟,就不要自称为C语言高手(函数指针是解耦对象关系的最佳利器,还有signal)
记得刚开始工作时,一位高手告诉我说,longjmp和setjmp玩得不熟,就不要自称为C语言高手.当时我半信半疑,为了让自己向高手方向迈进,还是花了一点时间去学习longjmp和setjmp的用法.后 ...
- C语言精要总结-指针系列(一)
考虑到指针内容繁多,这里将指针作为一个系列,从简入繁,一点一点深挖并掌握这C语言的精华.初步计划如下 此文为指针系列第一篇: C语言精要总结-指针系列(一) 内存与地址 我们可以把内存看做一排连续的房 ...
- PE格式第八讲,TLS表(线程局部存储)
PE格式第八讲,TLS表(线程局部存储) 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶复习线程相关知识 首先讲解 ...
- C语言第七讲,函数入门.
C语言第七讲,函数入门. 一丶了解面向过程和面向对象的区别. 为什么要先讲面向过程和面向对象的区别? 面向过程,就是什么都要自己做. 比如你要吃饭. 那么你得自己做饭. 面向对象, 面向对象就是我要 ...
- C语言第四讲,typedef 关键字,以及作用域
C语言第四讲,typedef 关键字,以及作用域 一丶typedef关键字 在C语言中,有typedef 关键字,这个关键字的作用就是允许你为类型定义一个新的名字,也就是 起个别的名字 例如: typ ...
- Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针
Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针 1.1. java方法引用(Method References) 与c#委托与脚本语言js ...
- Stanford机器学习---第八讲. 支持向量机SVM
原文: http://blog.csdn.net/abcjennifer/article/details/7849812 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回 ...
- 【转载】C/C++语言void及void指针深层探索
C/C++语言void及void指针深层探索 1.概述许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并详述vo ...
- 《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示
原文:<ArcGIS Engine+C#实例开发教程>第八讲 属性数据表的查询显示 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与Page ...
随机推荐
- django 在centos 7 下 指定ip地址和端口 报错问题
windows environment: python manage.py runserver host:port centos environment: python manage.py runse ...
- Python之路(第三十篇) 网络编程:socket、tcp/ip协议
一.客户端/服务器架构 1.硬件C/S架构(打印机) 打印机作为一个服务端,电脑连接打印机进行打印 2.软件C/S架构 互联网中处处是C/S架构 如谷歌网站是服务端,你的浏览器是客户端(B/S架构也是 ...
- 利用redis制作消息队列
redis在游戏服务器中的使用初探(一) 环境搭建redis在游戏服务器中的使用初探(二) 客户端开源库选择redis在游戏服务器中的使用初探(三) 信息存储redis在游戏服务器中的使用初探(四) ...
- Django高级篇三。restful的解析器,认证组件,权限组件
一.rest=framework之解析器 1)解析器作用. 根据提交的数据.只解析某些特定的数据.非法数据不接收,为了系统安全问题 比如解析的数据格式有 有application/json,x-www ...
- file 上传大小限制问题
今天突然传了一张很大的图片 结果怎么传都获取不到信息(如下); 最后查看了下php.ini 中的 " upload_max_filesize "最大只允许了2M! 改下就可以 ...
- Reading | 《Python基础教程》第1次阅读
目录 一.基础知识 1.数和表达式 浮点除法和整数除法 负数整除和取余 圆整 乘方运算 2.变量名 3.获取用户输入 4.模块 5.让脚本像普通程序一样 6.字符串 单.双引号 引号的转义 字符串拼接 ...
- Windows平台下载Android源码(整理)
Google官方下载源码使用的系统Ubuntu系统,不过现在我们需要在Windows系统中下载Android源码文件. 网站的地址是:https://android.googlesource.com/ ...
- 对 UDP 的一些思考
先放两个链接 快速可靠协议-KCP 可靠 UDP 传输 最近在玩王者荣耀,发觉两件事: 1. 可以 4G 和 wifi 无痛切换 2. 当网络不好的时候,发出去的消息并不保证到达服务器.比如你在很卡的 ...
- Centos7.x gnome 桌面美化
一.管理工具 gnome是通过gnome-tweak-tool(优化工具)来管理的,可以在左上角的应用程序->工具里找到. 也可以直接在终端输入gnome-tweak-tool来启动它.启动界面 ...
- AndroidStudio制作个人资料界面模块以及SQLite数据库的使用
前言 大家好,给大家带来AndroidStudio制作个人资料界面模块以及SQLite数据库的使用的概述,希望你们喜欢 学习目标 掌握SQLite数据库的使用,能够实现用数据库来保存用户的信息: 学会 ...