c++指针全攻略
1、指针概念理解
int* p 定义一个指针(推荐使用这种写法int* ,理解上有好处)
p 指针变量;
* 间接运算符(访问符),代表访问该地址所指向的空间;
*p 指针所保存(指向)的地址中对应(指向)的值;
&p 获取指针变量的内存地址(指针本身占用内存空间);
故 指针是
(1)通过间接的方式访问内存空间(直接方式是通过变量名称(内存空间名字)直接访问空间);
(2)指针是一种保存变量内存地址的变量,自身也占用内存空间。
eg:
指针初始化的两种方式
int a = ; //指针初始化方式第一种写法
int* p;//p是指针变量,而不是*p
p = &a;//指针变量用来存放内存地址;注意,此处使用*p = &a是错误的定义,应该是对p(指针变量)赋值,而不是*p(指针保存的地址指向的值) //指针初始化方式第二种写法,实质是第一种写法的简化方式。
int* p1 = &a; cout << " &p--对指针变量取地址--输出指针变量的地址:" << &p << endl;
cout << " *p--该指针保存的地址对应的值--输出指针所存放的地址对应的在堆内存中的值:" << *p << "\n";
2、声明指向int类型的指针,即指针包含的地址对应的内存单元存储了一个整数
int* p = NULL;
3、使用 指针 存储 由地址运算符& 获取的地址
int age = ;
int* pa = &age;
cout << "*pa = " << *pa << endl;
cout << "pa = " << pa << endl; //age的内存地址
cout << "&age = " << &age << endl;
cout << "指针自身的地址----&pa = " << &pa << endl; //指针自身的地址
4、const指针
int day = ;
int* const pDay = &day; //指针包含的地址是常量---常量指针
cout << pDay << endl; int hour = ;
const int* pHour = &hour; //指针指向的数据是常量---指向常量的指针
cout << pHour << endl; int h = ;
const int* const ph = &h; //指针包含的地址以及指向的值都是常量---指向常量的常量指针
cout << ph << endl;
5、 声明指向内存块的指针,即void指针
void 指针是一种特殊的指针,表示为“无类型指针”,由于 void 指针没有特定的类型,因此它可以指向任何类型的数据。也就是说,任何类型的指针都可以直接赋值给 void 指针,而无需进行其他相关的强制类型转换。
eg:
void* p1;
int* p2;
p1 = p2;
p2 = (int* )p1;
6、野指针:
把没有合法指向的指针称为“野”指针。因为“野”指针随机指向一块空间,该空间中存储的可能是其他程序的数据甚至是系统数据,故不能对“野”指针所指向的空间进行存取操作,否则轻者会引起程序崩溃,严重的可能导致整个系统崩溃。
eg:
int *pi,a; //pi未初始化,无合法指向,为“野”指针
*pi=; //运行时错误!不能对”野”指针指向的空间做存入操作。该语句试图把 3 存入“野”指针pi所指的随机空间中,会产生运行时错误。
a=*pi; //运行时错误!不能对”野”指针指向的空间取操作。该语句试图从“野”指针pi所指的空间中取出数据,然后赋给变量a同样会产生运行时错误。
7、指针运算
eg:
int* p = 4;
p++;
指针变量 p 进行 p++,p 是一个 int 类型的指针,指向内存地址 0x10000008 处。则 p++ 将指向与 p 相邻的下一个内存地址,由于 int 型数据占 4 个字节,因此 p++ 所指的内存地址为 1000000b。这种运算并不会改变指针变量 p 自身的地址,只是改变了它所指向的地址(存放的地址)。
8、补充:
c++指针内存空间释放
int* pb = new int;
int* pb2 = new int[];
delete pb;
delete[] pb2;
9、数组与指针:
(1)一维数组和指针
int* p,a[] = {,,,,};
p = a;//p指向数组a的首地址,即p=&a[0],数组名相当于数组首元素的地址a[0] //数组的访问方式
//1、直接访问---数组名[下标]
cout << a[] << "\n"; //2、间接访问---*(数组名+i)
cout << *(a+) << endl;// a+2表示数组首地址向后移动2个位置,a+2相当于&a[2] //3、间接访问--- *(指针变量)
for (int i=; i<; i++) {
cout << * p++ << endl;//++运算符的优先级要高于*
}
指针数组:存储指针的数组,int* p[5]
int a0,a1,a2,a3;
int* b[];
b[] = &a0;
b[] = &a1;
b[] = &a2;
数组指针:指向一维数组的指针,int (*p)[5]
int c[][];
int (*p)[];//定义一个数组指针,指向含4个元素的一维数组
p = c;//二维数组的首地址赋给p,即a[0],或&a[0][0]
(2)二维数组
int* p;
int a[][] = {{,,,},{,,,},{,,,}};
p = &a[][]; //通过数组下边直接访问 /*
* 通过地址间接访问,即*(*(a+i)j)的形式,二维数组可看成由特殊一维数组组成的一维数组,a[i]可看成一个由N列组成的一维数组, a表示a[0][0]的地址
* a[i]等价于*(a+i),表示i的首行地址,i行对应的一维数组的数组名。
* a[i]+0 <---> *(a+i)+0 <---> &a[i][0]
* a[i]+j <---> *(a+i)+j <---> &a[i][j]
* 地址即指针,通过间接运算符*,可以访问内存空间,则
* *(a[i]+j) <---> *(*(a+i)+j) <---> *&a[i][j] <---> a[i][j]
*/ cout << "a[0][0]的地址:" << a << endl;
cout << "a[0][1]的地址:" << a+ << endl;
cout << "a[1][0]的地址:" << a[]+ << endl;
cout << *(a+)+ << endl;
cout << &a[][] << endl;
10、函数与指针:
(1)指针函数,函数返回调用者某个地址即指针类型;
char* str_cat(char* c1, char* c2){
char* p1 = c1;
char* p2 = c2;
while (*p1!='\0'){
p1++;
} *p1++=' '; while (*p2!='\0'){
*p1++=*p2++;
} return c1;//返回结果为指针类型
}
(2)函数指针---指向函数的指针
int* pf (int, int);//函数的返回值为int指针类型,int*
int (*pf1) (int, int);//函数指针变量pf,可以指向任意含有两个整形参数,且返回值为整形的函数
pf = &fun;
pf = fun;//可以不用取地址,一个函数标识符就代表了它的地址
调用函数指针的方式两种方式
x = (*func)();
x = func();
非常感谢您的阅读,如需转载,请注明出处,本文链接https://www.cnblogs.com/huyangshu-fs/p/11617216.html
c++指针全攻略的更多相关文章
- Windows Socket五种I/O模型——代码全攻略(转)
Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模式.可以通过多线程技术进行处理. 非阻塞模式:执行I/O操 ...
- C++字符串【string】和【char []】操作全攻略
异想之旅:本人博客完全手敲,绝对非搬运,全网不可能有重复:本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告.本人所有文章发布平台为CSDN.博客园.简书和开源中国,后期可能会有个人博客,除此之外 ...
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
- 生成 PDF 全攻略【2】在已有PDF上添加内容
项目在变,需求在变,不变的永远是敲击键盘的程序员..... PDF 生成后,有时候需要在PDF上面添加一些其他的内容,比如文字,图片.... 经历几次失败的尝试,终于获取到了正确的代码书写方式. 在此 ...
- 从小工到专家 ——读《Java程序员职场全攻略》有感
从小工到专家 ——读<Java程序员职场全攻略>有感 <Java程序员职场全攻略>是以故事的形式,向读者介绍Java程序员的职场经验.作者牛开复在北京从事软件开发,已经是一 ...
- Android屏幕适配全攻略 (转载)
http://blog.csdn.net/jdsjlzx/article/details/45891551 https://github.com/hongyangAndroid/AndroidAuto ...
- Moon.Orm3.8技术全攻略
Moon.ORM技术全攻略 一.绪论 本文主要是针对Moon.ORM的技术的讨论及其使用使用指导.如有其它疑问,请留言.本文主要针对Moon.ORM3.9版本,同时将会对4.0做一个技术预览.本文从 ...
- TestLink安装全攻略
TestLink安装全攻略 此文章转自该链接--http://www.cnblogs.com/Tcorner/archive/2011/07/26/2117296.html 安装前准备 需要下载xam ...
- 取代奶瓶Minidwep-gtk破解WPA 全攻略
取代奶瓶Minidwep-gtk 破 WPA 全攻略 目录 1. CDlinux 下使用 minidwepgtk 获取握手包并使用自带的字典破解 2. 自带的字典破解不出密码时使用 U 盘外挂字典继 ...
随机推荐
- 洛谷 U87052 一线天
洛谷 U87052 一线天 题目传送门 题目背景 \(JDFZ\)即将举办第一届"一线天"趣味运动会...... 题目描述 "一线天"运动会在\(JLU\)南岭 ...
- VIJOS-P1059 积木城堡
洛谷 P1504 积木城堡 https://www.luogu.org/problem/P1504 JDOJ 1240: VIJOS-P1059 积木城堡 https://neooj.com/oldo ...
- MyEclipse10破解 运行run.bat闪退 亲自试验
找到MyEclipse安装的自带的jdk(方法是打开MyEclipse,依次window->Preferences->Java->Installed JRES找到默认路径,我的是:自 ...
- SpringBoot中的日志
默认情况下,Spring Boot会用SLF4J + Logback来记录日志,并用INFO级别输出到控制台. SLF4J,即简单日志门面(Simple Logging Facade for Java ...
- ASP.NET Core 新建项目(Windows)
对于任何语言和框架,都是从 Hello World 开始的,这个非常简单,但却有十分重大的意义,ASP.NET Core 基础教程也会以 Hello World 开始 为什么呢? 因为能够运行 Hel ...
- Linux性能优化实战学习笔记:第二十一讲
一 内存性能指标 1.系统内存使用情况 共享内存:是通过tmpfs实现的,所以它的大小也就是tmpfs使用的大小了tmpfs其实也是一种特殊的缓存 可用内存:是新进程可以使用的最大内存它包括剩余内存和 ...
- github git clone ssh协议 clone超慢解决方案,提高Github Clone速度
即使进行了fq吧但是git clone ssh协议就是慢 2kb/s你能忍,坚决不能忍. github git clone ssh协议 clone超慢解决方案 151.101.72.249 globa ...
- FFT(快速傅里叶变换)
FFT(快速傅里叶变换) 前置知识 \(1.复数\) \(2.单位根\) \(3.循环结构\) \(4.C++\) 1.复数 \(定义:形如a+bi的数,其中i^2=-1\) \(计算:1.(a+bi ...
- PyQt5笔记之标签
标签 QLabel用于显示文本或图像.没有提供用户交互功能.标签的视觉外观可以通过各种方式进行配置,并且可以用于为另一个窗口小部件指定焦点助记键. 一个QLabel可以包含以下任意内容类型: 内容 设 ...
- SQL --------------- order by 排序
首先创建一个表弄点数据 order by 关键字用于排序查询 默认按照升序(asc)进行排列 降序要使用 desc排序方式:数字按照大小 英文字母和汉字按照第一个字母 从 a-z 排列语 法: ...