C语言第八讲,指针*
C语言第八讲,指针*
一丶简单理解指针
说到指针,很多人都说是C语言的重点. 也说是C语言的难点.
其实指针并不是难.而是很多人搞不清地址 和 值.以及指针类型.
为什么这样说.
假设有两个变量,如下
int nNum1 = 1;
int nNum2 = 0x00401000;
变量nNum1 保存的值是1
变量nNum2 保存的是一个16进制数值.
那么如果我们把保存16进制的这个变量.当作指针. 也就是说它保存了一个16进制数值而已. 我们可以通过16进制找到里面存储的值.
但是因为是保存地址的变量.所以我们需要加上特殊符号进行定义.
例如:
int *nNum2 = 0x004010000;
指针其实就是保存了一个特殊的数值而已. 而通常这个数值我们说是地址.
如果我们保存了1的地址,那么我们就可以访问1了.
怎么访问?
可以通过取内容符号进行访问.
int nNum = 1;
int *p = &nNum1; //保存1的地址,我们可以不用管.也可以理解为一个16进制数值而已.
*p = 3; //修改地址空间的值.
二丶指针的数据类型
说到指针.其实我们说的并不是保存地址的难点.难点是该如何解释这个地址.
例如我们知道定义一个变量.我们可以知道这个变量的内存空间跟随这数据类型走.
例如:
int nNum1 = 3; //nNum1 大小是4个字节. 则 sizeof(nNum1) = 4;
short int nNum2 = 2; // nNum2 大小是2个字节. 则sizeof(nNum2) = 2;
....
那么我们指针其实也一样.也和普通变量一样.
int nNum1 = 2;
int *p = &nNum1; p的大小也是4个字节. 跟地址无关.
比如我们定义指针的是否有很多数据类型解释.
例如:
int *p;
short *p;
double *p;
那么地址解释的方式也就不一样.
根据上图可以得知,1所占的内存空间是4个字节,而不同的类型则有不同的解释方式.
如果解释为short *,则获得的是1的高位,如果解释为int *则是整个的1所代表的值.
三丶指针的运算
指针和我们普通变量运算不一样.
普通变量进行运算
int nNum1 = 1;
nNum1 ++; //nNum1 = 2;
指针变量进行运算
int *p = 0x00401000;
p++; 则P的值是0x00401004;
因为我们的类型是 int *解释方式,所以每次+1则是加一个int类型大小.而因为指针就是地址.
所以+1的时候就是+4
指针相减也是一样的.
四丶指针和数组的的组合
学习了指针,就要说下指针应用的场合. 数组和指针一般是很常见的.
例如定义数组:
int nNum1[10] = {1,2,3,4,5,6,7,8,9,10};
指针可以进行访问数组.
int *p = nNum1; //注意,数组是一个数据结构.所以我们不用加取地址符号.数组名就是数组的首地址.
如果我们是变量,则需要加上&符号.
例如:
int n = 10;
int *p = &n;
指针进行访问:
*p = 10; //数组元素的第一项更改为10
p++; //指针++,根据数据类型来相加,+1等于+4,则到数组的第二个元素了.
一般遍历数组的时候我们会封装成一个函数.
则会写成下面这样.
void IteratorArr(int *p, int Count)
{
while (Count--) //遍历的个数自减
{
printf("%d t",*p);
p++; //数组元素自加
}
puts("rn");
}
int main()
{
int Arr[] = { 1,2,3,4,5,6,7,8,9,10 };
IteratorArr(Arr,sizeof(Arr)/sizeof(Arr[0]));//传入数组首地址即可.但是我们函数的参数要定义为指针. 还需要传入数组的个数.进行遍历.
system("pause");
return 0;
}
输出结果.
五丶指针和函数的应用.
指针一般也用于函数的传参.例如上面我们遍历数组.其中我们的函数的形参就是指针.
如果在函数中想更改实际参数的值. 也可以用到指针.例如我们上一篇讲解函数的时候留下的一个小话题.
void ChangeValue(int *p, int *p1)
{
*p = 0; //传过来的是nNum1的地址,所以我们直接*地址对其更改即可.
*p1 = 11;
}
int main()
{
int nNum1 = 10;
int nNum2 = 11;
ChangeValue(&nNum1,&nNum2);
printf("nNum1 = %d nNum2 = %drn",nNum1,nNum2);
system("pause");
return 0;
}
输出结果.
函数指针.
指针的高级应用还有函数指针. 就是我们定义一个指针. 这个指针是函数指针.可以指向自己定义的一个函数.
函数名字就是函数的首地址.
例如:
void ChangeValue(int *p, int *p1)
{
*p = 0;
*p1 = 11;
}
int main()
{
int nNum1 = 10;
int nNum2 = 11;
ChangeValue(&nNum1,&nNum2);
int(*p)(char const* const _Format, ...); //定义函数指针
p = printf; //函数指针p指向了printf
p("nNum1 = %d nNum2 = %drn",nNum1,nNum2); //调用p实际和调用printf一样
system("pause");
return 0;
}
输出结果.
函数指针的语法
函数返回值 (* 指针变量名)(函数参数)
函数指针其实很好定义,只需要把函数的声明拿过来,然后函数名字前边加上括号. 括号里面加上*就可以了.
- tar.gz 解压
- Python&机器学习之项目实践
- JAVA CDI 学习(5) - 如何向RESTFul Service中注入EJB实例
- mysql5.7 column cannot be null
- 区块链大热 价值近20万的Matrix.io被启用
- 比特币科普之什么是区块高度?
- 如何正确并快速理解MapReduce
- mysqldump的简单使用
- mac:在当前文件夹打开terminal终端
- 斯诺登研发黑客警报App上架 监测功能引发争议
- JMS + jboss EAP 6.2 示例
- Maven Compilation error [package org.testng.annotations does not exist]
- 查看jar包的jdk版本并降级
- ejb3: message drive bean(MDB)示例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浙大版《C语言程序设计(第3版)》题目集 练习2-6 计算物体自由下落的距离
- 浙大版《C语言程序设计(第3版)》题目集 练习2-8 计算摄氏温度
- 浙大版《C语言程序设计(第3版)》题目集 练习2-9 整数四则运算
- 浙大版《C语言程序设计(第3版)》题目集 练习2-10 计算分段函数[1]
- 浙大版《C语言程序设计(第3版)》题目集 练习2-11 计算分段函数[2]
- SAP Spartacus产品页面的normalizer
- Nodejs中使用net-snmp库读取智慧站房的温湿度、空调等实时数据
- 生气!面试官你过来,我给你手写一个Spring Aop实现!
- 浙大版《C语言程序设计(第3版)》题目集 练习2-12 输出华氏-摄氏温度转换表
- Linux下文本处理“三剑客”
- Thread和goroutine两种方式实现共享变量按序输出
- 浙大版《C语言程序设计(第3版)》题目集 练习2-13 求N分之一序列前N项和
- 浙大版《C语言程序设计(第3版)》题目集 练习2-14 求奇数分之一序列前N项和
- dotnet 双缓存数据结构设计 下载库的文件写入缓存框架
- 浙大版《C语言程序设计(第3版)》题目集 练习2-15 求简单交错序列前N项和