一、指针变量的定义
变量的指针就是变量的地址。我们可以定义一个指向 变量(普通变量) 的 指针变量。这种指针变量,我们在定义的时候,会引入一个 * ,用于在定义的语句中表示“这是一个指针变量”。
一般形式:
类型标识符 *标识符 标识符:就是指针变量名字
int i,j; //普通变量
float k; //普通变量
int *mypoint1,*mypoint2; //定义两个指针变量,这两个指针变量 是指向整型变量的。
//指针变量定义时,变量名前面有个 *,这个是和普通变量最明显的区别。
float *pm3; //指向实型变量的指针
float *pm4; //指向实型变量的指针
如何让 整形指针变量 指向一个 整型变量 【整型指针变量只能指向整型变量,实型指针变量只能指向实型变量】
可以用赋值语句使一个整型指针变量指向一个整型变量(普通变量)
mypoint1= &i; //&地址符 等价于 mypoint1 指向了 i
mypoint2 = &j; //等价于 mypoint2 指向了 j
说明:
(1)“定义”指针变量的时候,指针变量前面是有“*”号的,表示这是正在“定义一个指针变量”。
但是,用指针变量的时候,指针变量名前面是没有 * 号的,所以指针变量名是 mypoint1,mypoint2,而不是 *mypoint1,*mypoint2.
(2) 一个指针变量只能指向同一个类型的变量(普通变量)
pm3=&k;
二、指针变量的引用
牢记:指针变量中只存放地址。不要将一个整型变量赋值给一个指针变量;
mypoint = 4; //这样是错误的,mypoint1是个指针变量,而4是个整数。
和指针变量相关的运算符有两个:
(1) &:取地址运算符。
(2) *:指针运算符(间接访问运算符),定义指针变量的时候,用到 * ,这个叫做指针运算符。
但是,如果 * 不出现在指针变量定义的场合,而且也不是一个乘法运算符,* 依旧是指针运算符,只不过代表的是该指针变量所指向的变量。
int a,b;
int *p1,*p2; //这里这个 * 表示这两个变量是指针变量。
a=100;
b=200;
p1=&a; //把变量 a的地址赋给了p1, ****现在p1指向了a
p2=&b; //把变量 b的地址赋给了p2, ****现在p2指向了b
printf("%d,%d\n",a,b);
printf("%d,%d\n",*p1,*p2); //*p1 指向的变量是 a; *p2 指向的变量是 b。 *p1=a=100;*p2=b=200;
//* 指针运算符 不用于定义指针变量的场合时,代表的是它所指向的变量
特殊写法解析:
(a) &*p1:&是取地址运算符,*是指针运算符,这两个运算符优先级相同,但是这两个运算符都是从右到左结合的;
因此先看 *p1 ,*p1代表的是p1所指向的变量,就是a,那么再执行&运算,就是 &*p1 等价于 &a;又因为 &a 它本身不就是 p1,所以 &*p1 等于什么也没有干。p1=&*p1; ==>p1=&a
(b) *&a:&是取地址运算符,*是指针运算符,这两个运算符优先级相同,但是这两个运算符都是从右到左结合的;
因此先看 &a ,也就是p1,那么再执行 * 运算,*&a=*p1,*p1代表的是p1指向的变量,所以也就是a,所以 *&a ==> a
(c) (*p1)++:*p1 是 a,所以(*p1)++ 就是 a++,这里a++就是100+1=101。
(d) *p1++:因为 ++和 * 同级,又是从右到左,所以 *p1++ =*(p1++); 但是注意,这里 p1是指向 变量a(p1保存变量a的地址),然而 p1++,就是内存地址+1,因为 p1是整型(占4个字节),所以 p1++就要跳4个字节。
例如:a 的内存地址是:0x0031fb4,p1++ 等价于 0x0031fb4+4= 0x0031fb8;
总述:地址是个数字,地址自加1是什么意思呢?
如果普通整型变量i,那么i++,i如果是4,那么i++是5,就是i这个变量对应的内存中的内容+1;
同理,指针变量自加 1,也肯定是这个指针变量中的内容要自加 1,但是这种本来是自加1的操作,对于指针来说就不一定是自加 1,自加几,取决于该指针变量所指向的变量类型,如果p1指向的是整型变量,那么 p1++的内容要加 4;因为 int 是4个字节,p1++ 意味着p1指向 i 之后的变量,要完整跳过4个字节,所以p1++后内存内容如下图所示:
p1++后的结果:
*(p1++)不再指向 a,他就指向 a后边的内存去了,这段内存就不知道是谁的,所以*p1++这个动作非常危险,因为你会改变不属于你的内存。
例题:
int *pmax,*pmin,*p,a,b;
a=5;
b=8;
pmax=&a;
pmin=&b;
if(a<b)
{
p=pmax; //现在p 指向 a (就是p 保存 a 的地址了)
pmax=pmin; //现在pmax 指向 b(就是变成 pmax 保存 b 的值,把最大数的地址保存到pmax)
pmin=p; //pmin 指向 a (就是变成 pmin 保存 a 的值,把最小数的地址保存到 pmin)
}
printf("a=%d,b=%d\n",a,b);
printf("max=%d,min=%d\n",*pmax,*pmin);
C语言 变量的指针和指向变量的指针变量相关推荐
- C语言 数组的指针和指向数组的指针变量
一.回顾二维数组和多维数组的概念 int a[3][4]; //二维数组 int a[2][3]4]; //多维数组 二.指向多维数组的指针和指针变量的探究 可以把a看成是一个一维数组,这个一维数 ...
- 字符串的指针和指向字符串的指针变量
引自:http://s319.dlut.edu.cn/educ/83.htm §8.4 字符串的指针和指向字符串的指针变量 8.4.1 字符串的表现形式 在C程序中,可以用两种方法实现一个字符串. ...
- 深入浅出C语言:(三)C 语言数组指针(指向数组的指针)
目录 一.C 语言数组指针(指向数组的指针) 二.C 语言字符串指针(指向字符串的指针) 三.C 语言指针数组(数组每个元素都是指针) 四.二维数组指针(指向二维数组的指针) 五.指针数组和二维数组指 ...
- 常指针和指向常量的指针
最近在学习引用,有一些学习心得,记录如下: 1:引用是变量的别名 int a; int b&=a; 要注意引用只有声明,而没有定义,并且引用必须在声明的时候进行初始化,一旦与某个变量关联起来, ...
- 辨析 const指针 和 指向常量的指针
辨析以下几种指针p的定义. int tmp = 5;int *p = &tmp; const int *p = &tmp; int const* p = &tmp; int * ...
- 超详细的const 指针与指向const的指针
最近在复习C++,指针这块真的是重难点,很久了也没有去理会,今晚好好总结一下const指针,好久没有写过博客了,记录一下~ const指针的定义: const指针是指针变量的值一经初始化,就不可以改变 ...
- [C++基础]018_常量指针和指向常量的指针
先来看一下什么是常量指针,什么是指向常量的指针吧! 1. 常量指针定义 1 int * const ptr = new int(); 2. 指向常量的指针 1 const int* ptr; 上面已经 ...
- const指针和指向常量的指针
先看下面六种写法: 1. const int p;2. const int *p;3. int const* p;4. int * const p;5. const int * const p;6. ...
- 区分指向数组元素的指针、指向数组的指针、指针数组
区分指向数组元素的指针.指向数组的指针.指针数组 指向数组元素的指针 这类指针比较常见,例如 int a[3] = {1, 2, 3}; int *p; p = a;//将数组的地址(也即数组首元素的 ...
- const指针和指向const的指针
今天在看项目代码时,发现竟然可以给有const修饰的指针赋值,按道理的话,const修饰的不是常量吗?常量应该是初始化之后就不能再修改才对.对于这个问题,我大致的研究了一下. 参考const 指针与指 ...
最新文章
- 各浏览器驱动下载地址
- jQuery之动画效果
- 作文 —— 诙谐、幽默、调侃、批判
- android kernel控制台初始化过程
- ubuntu 安装 TensorFlow、opencv3 的 tips
- vue中this.init用法_Vue中的this.$options.data()和this.$data用法说明
- IOS 控制器View的创建方式(方式的优先级 、view的延迟加载)
- Teamcenter 入门开发系列问答(3)
- 设计模式(Design pattern—
- 解决问题--java.lang.ClassNotFoundException -- redis抛出
- java远程方法调用(rmi)--好_java 远程方法调用(RMI)
- wpe手机中文汉化版下载_wpe中文3.0专业版
- 主题插件WordPress淘宝客ZZDGM主题Upanel插件使用补充
- IOT物联网技术架构_物联网系统架构正式上架
- USACO 2021 January Contest, BronzeProblem 2. Even More Odd Photos题解
- python 计算gdp_菜鸟笔记Python3——数据可视化(三)世界GDP分析
- 阿里云安全中心之漏洞修复最佳实践
- 雅可比(Jacobi)及高斯-塞德尔(Gauss_Seidel)迭代法求解线性方程组的matlab现实
- python IO模块【一】:IO类
- 安卓手机软件开发_这款安卓神器,让你下片更轻松!千万别滥用
热门文章
- 使用接口根据关键词取视频列表详情
- ERP-非财务人员的财务培训教(三)------公司/部门预算编制与评价
- php一键安装的环境包,php环境搭建的一键安装包有哪些?
- 自建一个本地dns归属地查询系统
- linux命令简化,Linux ls 命令实现(简化版)
- linux如何删除文件
- [OpenCV实战]10 使用Hu矩进行形状匹配
- 从全国首日票房破百万看零售商家的线下营销
- em算法怎么对应原有分类_EM算法
- 2022软件工程师薪资报告出炉!