05深入理解C指针之---指针声明和解引
该系列文章源于《深入理解C指针》的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教。
一、指针声明:
1、声明普通变量:“数据类型 + 空格 + 变量名 + ;”实现普通变量的声明语句;
2、声明指针:“数据类型 + 空格 + 变量名 + ;”只要在数据类型和变量名之间加一个“*"即可;
3、应用:
int var1 = 10; //声明普通变量,int是数据类型,空格作为int和var1的分割符,var1作为变量名
(1)int * ptrVar1; //*表明将变量声明为指针
(2)int* ptrVar1;
(3)int *ptrVar1;
(4)int*ptrVar1; //(1)(2)(3)(4)四种声明方式都是合法的,并且是完全等价的, 根据自己的眼光选择并坚持即可
注*:*既可以作为指针变量的声明标志;*也可以作为乘法运算的符号;*又可以作为指针的解引用中,可以根据上下文很容易区别
二、&操作符:
1、返回操作变量的地址;
2、常常利用之完成指针的初始化,一般在指针声明之后应尽快初始化;
3、应用:
&var1; //获取变量var1的地址;下面千万不能写*ptrVar1 = &var1;否则程序一定会出错的
ptrVar1 = &var1 //将变量var1的地址赋值给指针变量ptrVar1,通常又称为指针指向变量var1,
三、指针解引:
1、返回指针变量值(地址)处的变量值;
2、常常利用之完成指针的修改;
3、应用:
var1 = 11; //使用变量var1修改其内容,由10变为11
*ptrVar1 = 12; //使用指针解引*ptrVar1修改变量var1内容,由11变为12
四、指针打印:
1、打印指针变量值(地址)或普通变量的地址,在printf函数中,使用%x、%0、%p占位符占位即可;
2、常常查看指针的值或变量的地址,一般打印出来的是虚拟内存地址;
3、应用:
程序代码,打印变量var1地址和指针变量ptrVar1的值,通过指针变量的使用,为修改变量提供新的思路:
#include <stdio.h> int main(int argc, char **argv)
{
int var1 = ;
int *ptrVar1 = &var1;
printf("The ptrVar1 address: %p\n", &ptrVar1);
printf("The var1 address: %p and ptrVar1 value: %p\n", &var1, ptrVar1);
printf("The var1 value: %d and *ptrVar1 value: %d\n", var1, *ptrVar1); return ;
}
执行结果:
The ptrVar1 address: 0x7fff937d6250
The var1 address: 0x7fff937d625c and ptrVar1 value: 0x7fff937d625c
The var1 value: and *ptrVar1 value:
修改后的代码:
#include <stdio.h> int main(int argc, char **argv)
{
int var1 = ;
int *ptrVar1 = &var1;
printf("The ptrVar1 address: %p\n", &ptrVar1);
printf("The var1 address: %p and ptrVar1 value: %p\n", &var1, ptrVar1);
printf("The var1 value: %d and *ptrVar1 value: %d\n", var1, *ptrVar1); var1 = ;
printf("The ptrVar1 address: %p\n", &ptrVar1);
printf("The var1 address: %p and ptrVar1 value: %p\n", &var1, ptrVar1);
printf("The var1 value: %d and *ptrVar1 value: %d\n", var1, *ptrVar1); *ptrVar1 = ;
printf("The ptrVar1 address: %p\n", &ptrVar1);
printf("The var1 address: %p and ptrVar1 value: %p\n", &var1, ptrVar1);
printf("The var1 value: %d and *ptrVar1 value: %d\n", var1, *ptrVar1); return ;
}
修改后的执行结果:
The ptrVar1 address: 0x7ffc5e7477d0
The var1 address: 0x7ffc5e7477dc and ptrVar1 value: 0x7ffc5e7477dc
The var1 value: and *ptrVar1 value:
The ptrVar1 address: 0x7ffc5e7477d0
The var1 address: 0x7ffc5e7477dc and ptrVar1 value: 0x7ffc5e7477dc
The var1 value: and *ptrVar1 value:
The ptrVar1 address: 0x7ffc5e7477d0
The var1 address: 0x7ffc5e7477dc and ptrVar1 value: 0x7ffc5e7477dc
The var1 value: and *ptrVar1 value:
五、指针阅读:
1、遇到复杂的指针表达式时,从右往左阅读指针表达式更容易;
2、应用:
(1)const int *ptrVar1; //最右边的ptrVar1是一个变量
(2)const int *ptrVar1; //ptrVar1是一个指针变量
(3)const int *ptrVar1; //ptrVar1是一个指向整型数据的指针变量
(4)const int *ptrVar1; //ptrVar1是一个指向整型常量数据的指针变量
六、指针拾遗:
1、空指针的表示可以让指针赋值为NULL,也可以将指针赋值为整型值0,也可以将指针赋值为字符型数据'\0',根据自己的需要选择
1)、ptrVar1 = 0; //将指针ptrVar1变量不指向任何地址,指针变量不初始化可以指向任何地址
2)、ptrVar1 = NULL; //将指针ptrVar1变量不指向任何地址,指针变量不初始化可以指向任何地址
2、void指针,通用指针,万能指针,可以转换成任何类型的指针,它有几个特点:
1)、void指针具有与char指针相同的形式和内存对其方式;
2)、void指针和别的指针永远不会相等,除非两个都是NULL的void型指针;
3)、任何指针都可以被赋值给void指针,并能被顺利完好的转换回来;
4)、void指针只能用在数据指针,不能用于函数指针上
5)、void指针可以转换成任何指针,一旦转换成与原来不同类型的指针,就无法再安全转换成原来的指针了;
05深入理解C指针之---指针声明和解引的更多相关文章
- 10深入理解C指针之---指针运算和比较
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 指针运算有很多种,主要有指针的声明*.指针的解引*.指针指向(*).或->.指针 ...
- 理解C语言中指针的声明以及复杂声明的语法
昨天刚把<C程序设计语言>中"指针与数组"章节读完,最终把心中的疑惑彻底解开了.如今记录下我对指针声明的理解.顺便说下怎样在C语言中创建复杂声明以及读懂复杂声明. 本文 ...
- [C/C++]如何解读返回函数指针的函数声明
今天在看<深入理解C++11>的时候,看到一段有意思的代码: int (*(*pf())())() { return nullptr; } 我立刻就懵了——从来没有见过这样的函数声明.那么 ...
- 深入理解C语言函数指针(转)
本文转自:http://www.cnblogs.com/windlaughing/archive/2013/04/10/3012012.html 示例1: void myFun(int x); //声 ...
- 02深入理解C指针之---指针类型和值
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 1.指针的类型: 可以在声明指针时,指定指针的类型,例如: (1)void *x 声 ...
- 06深入理解C指针之---指针操作和比较
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. 指针作为一种特殊类型的变量,必须遵守C语言中变量先声明后使用的原则.本节内容中指针的操 ...
- 00深入理解C指针之--- 指针之外
该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教. C语言从诞生之初就非常善于和硬件打交道,经过这么多年的发展之后,其灵活性和超强的特征是 ...
- 这样子来理解C语言中指针的指针
友情提示:阅读本文前,请先参考我的之前的文章<从四个属性的角度来理解C语言的指针也许会更好理解>,若已阅读,请继续往下看. 我从4个属性的角度来总结了C语言中的指针概念.对于C语言的一个指 ...
- 从四个属性的角度来理解C语言的指针也许会更好理解
文章会在文末更新! 关于指针是什么,很多教材已经作出了定义,大多数都会定义为"存放变量内存地址的变量".从这句话中我觉得除了让我知道这个定义有11个字以外,其他就没什么用了.我个人 ...
随机推荐
- 几种排序算法的比较转自http://blog.csdn.net/keenweiwei/article/details/3697452
1冒泡排序: 已知一组无需数据a[1],a[2],a[3],a[4],a[5][a[n],将其按升序排列,首先找出这组数据中最大值,将a[1]与a[2]比较,若a[1]大,则交换两者的值,否则不变,在 ...
- [vijos]P1642 班长的任务
背景 十八居士的毕业典礼(1) 描述 福州时代中学2009届十班同学毕业了,于是班长PRT开始筹办毕业晚会,但是由于条件有限,可能每个同学不能都去,但每个人都有一个权值,PRT希望来的同学们的权值总和 ...
- PostgreSQL学习(2)-- mvcc
1.PG事务隔离级别 在数据库中,并发的操作进行读写数据时,则会遇到脏读.不可重复读.幻读.串行化异常等问题. 数据库事务的特性: 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对 ...
- 【模板】有旋Treap
如题,这是一个模板... #include <algorithm> #include <iostream> #include <cstring> #include ...
- Spring Boot 应用 快速发布到linux服务器的脚本代码示例
前提说明:spring boot 应用打包成jar包之后要部署到Linux服务器上面运行,我用的nohup java -jar 命令,但是代码更新之后重新部署的时候覆盖原来的项目,又要手动运行ps - ...
- Python开发环境与开发软件的安装
Python开发的必要因素: 开发软件:PyCharm 社区版 PyCharm安装过程: 首先去官网下载:(链接为: https://www.jetbrains.com/pycharm/downlo ...
- 【南邮】md5 collision write up
源码: <?php $md51 = md5('QNKCDZO'); $a = @$_GET['a']; $md52 = @md5($a); if(isset($a)){ if ($a != 'Q ...
- 水题:51Nod1432-独木舟
1432 独木舟 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 Problem Description n个人,已知每个人体重.独木舟承重固定,每只独木舟最多坐两 ...
- 并查集:POJ1182-食物链(并查集比较高端的应用)
食物链 Time Limit: 1000MS Memory Limit: 10000K Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C ...
- 建立,查询二叉树 hdu 5444
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...