IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c/c++专题-指针概念通俗理解 -> 正文阅读

[C++知识库]c/c++专题-指针概念通俗理解

目录

杂言

指针的基本概念

常见指针类型

结构体指针

数组指针

多维指针

指针本身的运算

参数类型

? 值形参数

? 指针参数

总结


杂言

? 对它简单处理,它就简单;
??对它复杂处理,它就复杂;
? 复杂难以把控,无法预测;
? 可预测的程度,关系成败;

指针的基本概念

? 指针和链表在c和c++语言是很基本的概念和功能。在其它语言也是重要的部分,只不过是退化了指针功能,封装起来进行管理用户不需要关心。

? c语言是比较底层的语言,比汇编高级点。要能透彻的理解指针的运行原理最好能够简单了解下计算机的组成原理和主要过程,下图简单介绍了一个简单的计算程序是怎么运行的

?

? 通过上图中可以看出来,基本上所有的数据计算都是放在内存里面。内存通过一个个地址编号进行寻址。
? 指针就是为了描述地址而生的,所谓指针就是某个内存单元里面存储的是一个地址,而不是一个普通的数据值。我们以下面程序来说明指针变量和一般变量的内存里面存储的区别

            int a, *p;
            a = 1;  p = &a; *p = 2;
            printf("a=%d\n", a); 输出a=2

? ? 如下图:有几点说明?

  • ? ?指针p是一个变量,它也有内存存储它,这里地址是001
  • ? ?指针p地址的存储的内容还是一个地址,指向的是一个地址004,这就是指针特殊的地方
  • ? ?*p的运算是针对它指向地址里面的值的运算
  • ? ?p=p+1 = 005?是指针本身值的运算,原来p=004,所以+1 = 005,具体要跳一个类型的长度
  • ? ?&p = 001 只的是取的存储指针p的地址,也就是所谓的指针的指针**,所有的变量都有一个地方的存储

?总结:
? ? ? ? ?指针和一般其它的变量一样,有存储它的地方,它唯一区别是它存储的是一个地址

常见指针类型

结构体指针

typedef struct __aa {
    int data;
    int index;
}aa, *paa;

aa  aa_test;
    aa_test.data = aa_test.index = 1;

aa* p_aa_test = &aa_test;

?p_aa_test是一个结指向aa_test的一个结构体指针,和一般的指针没有啥区别也是占一个地址,然后后面指向了一个结构体地址,这个结构体占8个字节

数组指针

int *p[3];  //定义一个数组指针

int a, b, c; 
a = b = c = 1;

p[0] = &a; //给指针赋值
p[1] = &b;
p[2] = &c;

? 数组指针p有3个元素,每个元素是一个指针,每个元素存的值是一个地址,其它的和一般的数组基本一样。?

??

多维指针

int a = 1;
int *p = &a;   //一维指针
int **pp = &p; //二维指针

? pp 是一个二维指针,是一个一维指向p的指针,p指向的a的地址,p=*pp。 三维等等都一样的理解

指针本身的运算

? 指针本身的运算和一般类型运算稍微有点区别,我们知道指针事实上就是存储了一个地址,那么它的运算肯定要和地址有关系,那是什么样的关系呢,对于 一个指针 p 那么 p++ 之后 p=?多少呢
看下面的代码和分析图就很清楚了

typedef struct __cc {
    int data;
    int index;
}cc, *pcc;

char a;
char *pa = &a;  //定义一个字符指针
pa = pa+4;

int b;
int *pb = &b;   //定义一个整形指针
pb = pb+1;

cc c;
cc *pc = &c;    //定义一个结构体指针
pc = pc+1;

int *d;
int **pd;       //定义一个整形二维指针
pd = pd+1;

? ?如下图是上面指针 pa? pb pc pd 执行加法操作后的结果,其中pa是加了4

? ?总结一下,上面说了指针的运算是和地址有关系的,那么加1,理论上应该要指向下一个有效地址,因为每种类型的占用的地址宽不一样,所以下一个有效地址要在原基础上加上该类型的地址宽度,那么char占用地址宽度是1?,int占用4,结构体cc占用8,一个一维指针占用4, 所以得到以上结果

参数类型

? ? 参数基本分为两种类型,一种是值形参数,一种是指针参数或者叫地址参数,数组也是一种指针或者地址参数

? 值形参数

? ? ? ? ?如这个函数原型? int? func_test(int? a,? int? b);
这种参数的特点是,需要值拷贝,并且中间会有一个中间变量,?假设一个函数中调用这个函数
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?call() {int a, ?b;? func_test(a, b); }?
call函数里面的a b变量和func_test里的a b变量完全是不同的,在调用传值的过程中会产生一个中间变量 _a,? _b? 执行一个值拷贝 _a = a,? _b = b;??func_test里面操作的是 _a, _b。所以在func_test函数里面随便更改a和b的值都不会对call里面的a,b没有任何影响。 这也是为啥常常在交换两个值的时候,如果这么传值没有效果的原因。

? ? ? ? 值形参数还有一个很大的问题是性能开销, 会有值拷贝和多余的中间变量

? 指针参数

? ? ? ? 如这个函数原型? int? func_test(int? *a,? int? *b);
这种参数的特点是,传递的变量的地址,中间不会有一个中间变量,?假设一个函数中调用这个函数
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?call() {int a, ?b;? func_test(&a, &b); }?

call函数里面的a b变量和func_test里的a b变量完全是通过地址对应的,因为地址在一个变量的生命周期是不会变的,?所以在 func_test里面操作的是 a,b就是call里面的a,b地址。 这也是为啥常常在交换两个值的时候,需要传地址的原因。

? ? 总结一下:指针参数即是地址参数,在函数各个调用过程中以地址为桥梁,建立联系。理论上这里有个个人意见,觉得c语言在开始设计之初应该只有地址传参是否更加合适呢,在性能和使用上更加贴切c的定位

总结

? ? 指针就是一个变量,只不过它只是执行地址的一个变量,它自己也有存储的地方,多维指针就是取指针的地址组合而成,后面再讨论指针用法的各个场景和注意点

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 20:56:54  更:2022-10-22 20:58:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 6:21:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码