int * *p;
代码如下: int a; int *p p=&a;
将变量a的地址赋给p 代码如下:
int a[3]={1,2,3}; int *p; p=a;
将数组首元素的地址赋给指针p 代码如下:
int a[3]={1,2,3}; int *p; p=&a[2];
将数组中的元素的地址赋给指针p 代码如下:
int main(){ int f(int z); int (*p)(int z); p=f; p(5); } int f(int z ){ cout<}
f为已经定义的函数,将f的入口地址赋给p 代码如下:
int a=3; int *p1=&a; int *p2=p1;
p1和p2是同类型的指针,将p1的值赋给p2
(2)指针变量赋空值 指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示:
代码如下:
p=NULL;
实际上NULL代表整数0,也就是使p指向地址为0的单元。这样可以使指针不指向任何有效的单元。 实际上系统已经定义了NULL: 代码如下:
#define NULL 0
C++中在iostream头文件中就包括了以上的NULL定义,NULL使一个符号常量。 在C-free编辑器中运行: 代码如下:
#include using namespace std; int main(){ cout< cout<}
应注意,p的值等于NULL和p未被赋是两个概念。前者是有值得(值为0),不指向任何变量,后者虽未对p赋值但并不等于p无值,只是它的值是一个无法预料的值,也就是p可能指向某一个未指定的单元。这种情况是非常危险的。因此,在饮用变量之前一定要对其进行赋值。
任何指针变量或地址都可以与NULL做相等或者不等的比较:
代码如下:
if(p==NULL)p=p1;
上面的语句还可以写成: 代码如下:
if(!p)p=p1;
还应注意int *p=NULL;和int *p;*p=NULL;的区别: int *p=NULL是定义了一个指向整形变量的指针,并且对该指针进行了初始化操作,赋初始值为NULL; 而int *p;是定义了一个指向整形变量的指针,因为没有对该指针进行初始化,所以它可能指向任何一个值,因此可能指向一个非法的值,例如系统内存中的变量。 然后*p =NULL;是使p所指向的变量的值为0,因为p所指向的值是不确定的,所以该操作是十分危险的。
(3)指针变量的赋值应该注意的问题 我们知道基类型相同的不同的指针变量之间可以赋值。 不同的的基类型的变量之间是不可以进行赋值的。 运行代码:
代码如下:
#include using namespace std; int main(){ int *p1,i=5; double *p2 ,j=2.5; p1=&i; p2=&j; p1=p2; cout<<*p1< return 0; }
编辑器提示:
可以通过强制类型转化实现上述赋值:
代码如下:
#include using namespace std; int main(){ int *p1,i=5; double *p2 ,j=2.5; p1=&i; cout<<*p1< p2=&j; cout<<*p2< p1=(int *)p2; cout<<*p1< return 0; }
虽然,上述操作不再报错,但是指针的强制类型转发生了数据截断,所以仍然得不到理想的结果:
关于指针的强制类型转换(4)指针变量加/减一个整数
例如:
代码如下:
p++; p--; p+i; p-1; p+=i; p-=i;
C++规定,一个指针变量加/减一个整数是将该指针变量的原值(原来指向的地址)和它指向的变量所占用的内存单元字节数相加或者相减。 如p+i;代表这样的地址计算:p+i*d,d是p所指向的变量单元所占用的字节数。这样才能保证p+i指向p下面的第i个元素。
(5)两个指针变量相减 如果两个指针指向的同一个数组中的元素,则两个指针变量之差是两个指针变来那个之间的元素的个数。
代码如下:
#include using namespace std; int main(){ int a[10]={1,2,3,4,5,6,7,8,9,10}; int *p1=&a[3]; int *p2=&a[5]; cout<<(p2-p1)< cout<<(p1-p2)< return 0; }
运行结果:(6)两个指针变量比较 若两个指针指向同一个数组的元素,则可以进行比较大小。指向前面元素的指针变量小于指向后面元素的指针变量。 代码如下:
#include
using namespace std; int main(){ int a[10]={1,2,3,4,5,6,7,8,9,10}; int *p1=&a[3]; int *p2=&a[5]; if(p1 cout<<"p1 }else{ cout<<"p1>=p2"< } return 0; } 结果输出:
还可以利用这个性质,输出数组中的所有的元素:
代码如下:
#include
using namespace std; int main(){ int a[10]={1,2,3,4,5,6,7,8,9,10}; int *p=a; while(p cout<<*p< p++; } return 0; } 输出结果:
推荐阅读
本文介绍了三种方法来关闭win7电脑开机硬盘自检,分别是使用命令提示符、注册表编辑器和bios设置界面。通过取消硬盘自检可以加快电脑启动速度。详细步骤和操作说明在正文中有详细介绍。 ...
[详细]
蜡笔小新 2023-12-11 14:10:01
本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ...
[详细]
蜡笔小新 2023-12-14 10:34:15
本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ...
[详细]
蜡笔小新 2023-12-14 21:02:28
本文详细介绍了在Power Query中进行删除错误和删除空值的操作方法。首先通过转换数据选项将数据源导入到Power BI Desktop中,然后进入Power Query查询编辑器界面,将需要更换类型的字段转换为整数类型。对于出现Error值的字段,可以选择删除错误或替换错误指令进行操作。对于出现null值的数据,可以通过下拉筛选按钮勾选掉null进行删除。最终的操作结果如图所示。本文的内容旨在帮助读者学习Power Query中的删除错误和删除空值操作,并便于日后的数据处理和分析。 ...
[详细]
蜡笔小新 2023-12-14 20:48:12
微软今日发布了OneNoteforWordPress插件,该插件支持从OneNote一键获取 ...
[详细]
蜡笔小新 2023-12-13 18:35:09
在使用Pycharm编辑器时,双击shift会弹出搜索框界面,导致输入失去焦点,给用户带来不便。本文介绍了取消双击shift弹出搜索框的方法:在Pycharm中双击shift,输入registry并回车,找到“ide.suppress.double.click.handler”并勾选后,关闭即可解决该问题。通过这个方法,你再也不会被shift问题困扰了。 ...
[详细]
蜡笔小新 2023-12-13 17:18:11
本文介绍了使用迅捷PDF编辑器给PDF文件设置全屏动画的方法,包括安装软件、添加PDF文件、设置动画效果和页面范围等步骤,帮助用户实现PDF文件的全屏动画效果。操作简单,适用于华为全屏等设备。 ...
[详细]
蜡笔小新 2023-12-13 17:05:50
本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ...
[详细]
蜡笔小新 2023-12-13 14:24:45
本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ...
[详细]
蜡笔小新 2023-12-12 19:37:50
本文讨论了在PHP中将空格转换为问号的问题,并提供了解决方案。文章指出,空格不是标准的空格,而是特殊的0xC2 0xA0字符。作者尝试使用mb_convert_encoding函数将utf8字符串转换为gbk编码,但未成功。文章建议检查编辑器是否对空格进行了特殊处理,并提供了使用base64_encode函数打印结果的方法。最后,给出了完整的代码示例。 ...
[详细]
蜡笔小新 2023-12-12 16:30:04
本文详细介绍了Vim编辑器中的三种模式(命令模式、末行模式和编辑模式)以及它们之间的操作区别和切换方法。Vim编辑器凭借其多种命令快捷键和高效率的操作方式,得到了广大厂商和用户的认可。对于想要高效操作文本的用户来说,了解这些模式的使用方法是必不可少的。 ...
[详细]
蜡笔小新 2023-12-12 15:59:51
本文介绍了在Win7系统中如何通过组策略编辑器设置,实现Ctrl+Alt+Del热键组合呼出任务管理器的方法。通过删除原有的项目并设置呼出任务管理器,用户可以方便地使用Ctrl+Alt+Del热键组合来打开任务管理器。 ...
[详细]
蜡笔小新 2023-12-11 10:48:25
本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ...
[详细]
蜡笔小新 2023-12-11 09:41:26
本文介绍了C4D软件自带的渲染器效果较差的问题,并推荐了四款C4D渲染器,其中包括OC渲染器和阿诺德渲染器。OC渲染器渲染速度快,简单易用,特别适合小团队和个人使用,而阿诺德渲染器具有超快的预览功能和真实的渲染效果,适合在体积光处理方面使用。两款渲染器都支持多个C4D版本和不同操作系统。 ...
[详细]
蜡笔小新 2023-12-11 09:04:00
本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ...
[详细]
蜡笔小新 2023-12-10 19:24:11