哎,由于上课的时候没有听课,导致指针这里真的是似懂非懂,虽然对写代码影响不大,但是总是精确度下了一个档次,所以今天趁机把这写个玩意儿弄明白点,省的以后每次都得查。咱们不求文章长,只求内容清楚~

 如果有谁看出了里面有什么问题,请帮忙指出来,免得误导别人~饺子在此先说声谢谢了~


其实关于数组比较好掌握,就是分配某种类型的一个组,这个组的长度必须给出或者初始化,我一开始觉得很不方便,因为有很多情况下我们不知道数组的长度,比如这个数组要由用户定义之类的情况,但是没办法,电脑要为这个数组分配一个内存空间,你不告诉电脑,电脑编译的时候就迷茫了,得出错,所以就互相迁就吧,给他个长度,或者给个初始值,这都是必要的。

数组的声明:简单来说,数组是从低维,0开始存放的,举个例子  int a[2][2] 在内存里的存放顺序就是:a[0][0] - a[0][1] - a[1][0] - a[1][1]. 额,因为就俩数字所以看起来像二进制数数,反正就这个道理。声明的时候,要么就给出中括号里面的数字,要么就给个初始化,比如 int a[2][2];   或者int a[][2]={1,1,1,1};当然这个等效于int a[][2]={{1,1},{1,1}};  注意,低维的数字不能省,这个‘[2]’里的2不可以省。

接下来是指针

首先要知道的是内存的访问方式,一般来说我们都是通过变量名来访问内存的,比如int a=1; 我们通过a来访问这个存放1的内存,但是还有一种方式是通过地址来访问。打个比方,学校就是我们的内存,每个学生都有自己的名字,以及对应的学号,那么名字就是这里的变量名,而学号就是地址,在批量处理,要传输大量数据的时候,通过学号当然比通过名字访问要方便,所以两个方式各有千秋,必须都掌握好。

指针: 指针其实是一种数据类型,具有指针类型的变量成为指针变量,指针变量用来存放内存单元地址。声明方法如下:

//数据类型 * 标识符char * c;

这里的*就告诉电脑这是个指针变量,前面的数据类型只表示指针所指地址的数据是那种类型,也就是说,c是指针,不是char(说了句废话。。)。

可以这么理解,'*' 相当于我们定义一个变量int a=3;时的'int', 至于为什么要声明内存的数据类型(也就是为什么'*'前要有'char'),原因很简单,不同的数据类型占有的内存单元长度不同,比如是个short类型的指针,那么内存占俩个字节,但是如果是long的话,就占4个字节,所以要有数据类型,告诉指针取几个字节。

感谢8楼的总结,我在这里引用一下:

指针,是一个内存读取器类。
可以按照给定的数据类型定义和地址位置返回期望的数据值。

数组,是对指针的再次封装。
包含一个连续内存块以及一个指针常量。

关于'*'和'&'

'*'的意思之前也讲过了,就是个指针运算符。‘&’的名字叫取地址运算符。区别可以这么说:

int * p; //定义了一个int型指针。int a;p=&a; // p等于a的地址,也就是说&这个符号表示‘取地址’

‘&’ 这个符号还可以这么用:int &y; 表示声明一个int型的引用 y。

给指针赋值可以像上面↑那样,先声明,后赋值,也可以是声明的时候直接赋值,效果雷同给普通变量赋值。注意,对于数组,可以直接用数组名,因为数组名就是它的地址:

int a[5];int *p=a;//不需要'&',因为a本身即是一个地址了。

使用指针是,如果直接使用,出来的是地址,加个'*',出来的是内容,具体这么表示吧:

int a=5;int *p=&a;cout<<p<<endl; // 这一行将输出a的地址cout<<*p<<endl; // 这一行将输出数字'5'

声明的时候要注意:

  • 可以声明指向常量的指针,但是不要妄图通过指针来改变这个常量值╮(╯_╰)╭,不过指针不像常量那么有节操,指针可以改变所指对象的值。如下:

    const char * p="HELLO"; // 这个const是形容char的char s[]="HI";p=s;   //这么写是可以的,就是相当于给p一个新的地址,
    
    *p='HI'; // 这就要出错了,都说了人家char是个常量了,不要改人家嘛。
    
    //但是:char *p="HELLO";*p='H'; //这个编译可以通过,但是运行出错了。因为违反了指针的规则。

    利用这个特点,可以保证指针所指向的常量不被意外更改。

  • ‘*’放在const前面的话,表示这个指针是个常量,指针本身不能被更改。下面这种情况 line2是不被允许的说~
    char * const p="abc";p="def"; // nonono,要出错咯~

  • 虽然我很讨厌规矩,但是编程嘛,必须按着规矩来,定义了什么类型的指针,就赋什么类型的值,咱不能给int型指针赋个'x'是吧。不过总有那么几个叛逆的,所以就有了种叫做void类型的指针,通过强制转换,可以访问任何类型的数据。void指针的使用:
    void *vp;  // 一个void类型的指针int a=5;int *px;vp = &a;  px = (int *)vp;//把vp的void * 强制转换成 int *,好满足px的类型。


指针的运算:

指针可以进行加、减运算,规则其实很容易理解。比如我定义了一个short型指针p,占4个字节,那么p+1,就是地址往后数4个字节,一般是给数组用的。比如:

int a[]={2,3,4,5};int *p=a;cout<<*(p+1)<<endl; //输出就是3

指针型函数:

这个东西是大大的好啊,可以让返回值从一个扩展的大批的数据,具体用法就是返回类型后面加个"*",用起来很爽。同样来点内容免得光说不练。

int * getAll(int *a){     .....    //   处理了半天,然后返回     return a;}  

(这里谢谢@陈梓瀚(vczh)的指正)

这样返回的就是四个数字而不是一个数字了,可以通过返回的指针,进行运算,得到这批数据,并且可以保护这批数据。

指向函数的指针

其实函数和数组一样,在内存中从函数名开始存起,也就是说知道了函数名,接下来的内存里放的就是函数体了,所以,既然指针可以指向数组,当然也可以指向函数了。形式就是: 数据类型 (* 函数指针名)(形参表)   如果一个函数的   返回值类型=指针数据类型  形参表=指针形参表,那个这个函数指针就可以指向这个函数了。

void function(int a,int b);void function2(int x,int y);void (* fpointer)(int,int); //必须和要指向的函数形参类型,个数,顺序完全相同,才能指向这个函数

//使用时:function(5,5);//  上下 两者效果等同fpointer=function;fpointer(6,6);

fpointer=function2; // 多好啊还可以指向别的函数,只要条件符合。

对象指针:(话说这部分其实很废柴啊囧rz)
 就是指向一个类的指针 语法: 类名 * 指针名;   调用成员时: 指针名->成员名; 注意在给指针赋值前,要对这个对象进行初始化~

Clock c(1,2,4);Clock *p;p=&c; //这里c必须是初始化好的。否则不可以使用指针pp->getTime();

指向类的非静态成员的指针:在类的外部定义一个指针指向类得公有成员时,定义如下:

如果是公有数据成员:

Clock  clock(1,1,2);Clock *pClock = &clock;//定义int Clock::*pHour;

//赋值:pHour=&Clock::Hour;

//调用:(三个效果相同)clock.*pHour;pClock->Hour;clcok.Hour;

如果是公有函数成员:

Clock  clock(1,1,2);Clock *pClock = &clock;//定义:  返回类型 (类名::*指针名)(参数表)int (Clock::*pGetHour)();

//赋值:pGetHour= &Clock::GetHour;

//调用:(三个效果相同)clock.*pGetHour;pClock->GetHour;clcok.GetHour;

到这里我已经头晕了,不知道耐心看到这里的同学们头晕了没?晕了的话喝口水,刷刷微博先,劳逸结合嘛~

动态内存分配:(哇,听起来好高端)7行代码概括:

int *point;point = new int(2); //分配动态存储空间并把数值2放入内存// .....delete point;/*------------------------------------------*/Clock *pclock = new Clock[2]; //此时不可以初始化pclock[0].Set(1,2,3);//就假设有这么个函数呗pclock[1].Set(4,5,6);delete[] pclock; //就是为了说,这里delete后面要有‘[]’

浅拷贝和深拷贝:(最后一点儿啦  加油~)

其实这个用代码写起来复杂,但是说起来很简单。

如果一个类里面有个成员p是个指针,定义了实体对象clock, clock2,然后clock中的p指向一个存着int型数据的内存空间。当我们仅仅用clock2.p=clock.p来给clock2中的p赋值的话,其实两个实体对象的指针p就指向了同一个内存空间,这样的话,对这个内存空间的数字进行操作的时候,就会同时影响到clock和clock2.这就是浅拷贝。

深拷贝,就是让它不印象呗。所以clock2的p如果这么拷贝:p=new int(*clock.p); 那么俩玩意儿就互不影响了,如此这般,就是深拷贝。

呼,终于结束了,玩儿微博去也~

转载于:https://www.cnblogs.com/jiaozihardworking/archive/2012/02/09/2343404.html

C++中的数组,指针解析相关推荐

  1. 指针数组 c ++_了解C ++中的数组指针

    指针数组 c ++ 介绍 (Introduction) Today in this tutorial, we are going to understand the concept of the Po ...

  2. 关于C语言中的数组指针、指针数组以及二级指针

    概念解释 数组指针:首先它是一个指针,它指向一个数组,即指向数组的指针:在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.数组指针指向的是数组中的一个具体元素,而不是整个数组,所 ...

  3. 详解C语言中的数组指针与指针数组

    ·详解数组指针与指针数组 ·数组指针 一.区分 首先我们需要了解什么是数组指针以及什么是指针数组,如下图: int *p[5]; int (*p)[5]; 数组指针的意思即为通过指针引用数组,p先和* ...

  4. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  5. Perl 教学 Perl5中的引用(指针)

    一.引用简介    引用就是指针,可以指向变量.数组.哈希表(也叫关联数组)甚至子程序.Pascal或C程序员应该对引用(即指针)的概念很熟悉,引用就是某值的地址,对其的使用则取决于程序员和语言的规定 ...

  6. C++之指针探究(五):数组指针和二维数组

    前文:C++之指针探究(四):指针和二维数组 回顾:初始化二维数组时可以"偷懒":int array[2][3]={{0,1,2},{3,4,5}}; 可以写成:int array ...

  7. 关于STM32中定义数组的问题

    功能描述:今天做数据采集,TIM2定时中断20ms采集一次数据,并存入一个数组中.采集完4000个数据后,用串口将这4000个数据依次发送给上位机. 问题描述:DEBUG中对数组指针add watch ...

  8. php 数组 指针,PHP数组指针操作

    日常开发过程中,接触最多的莫过于是数组了,但是数组的操作我们一般都是用来做读写的,很少操作到有关游标(指针),但是再实际的时用中,如果利用了游标,我们的开发速度及效率会大大的提高. PHP中有关数组指 ...

  9. perl数组硬引用_Perl基础 Perl引用和数组用法解析

    本文和大家重点讨论一下Perl引用和数组的概念,Perl5中的两种Perl引用类型为硬引用和符号引用.符号引用含有变量的名字,它对运行时创建变量名并定位很有用,基本上,符号Perl引用就象文件名或UN ...

  10. C语言 内存分配 地址 指针 数组 参数 解析

    指针简介 : 指针式保存变量地址的变量; -- 增加阅读难度 : 指针 和 goto 语句会增加程序的理解难度, 容易出现错误; -- ANSI C : American National Stand ...

最新文章

  1. [C] [字节跳动] [编程题] 手串
  2. 哪些物联网应用最适合采用雾计算?
  3. Android开发--圆角按钮和绘制直线的实现
  4. watir添加新标签
  5. Linux命令行下关机【Ubuntu】
  6. 位地址和字节地址换算_关于ip地址的详解,看完这篇就够了
  7. 06_排序_希尔排序
  8. XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager,
  9. 这个温州人,是中国开店最多的炸鸡王者
  10. 【报告分享】2021年中国新锐品牌增长潜力报告.pdf(附下载链接)
  11. vue入门学习(基础篇)
  12. C# System.Drawing.SystemColors 系统颜色
  13. aardio - 【库】内存画板 paint
  14. codec engine代码阅读四---CE_DIR/examples/ti/sdo/ce/examles/codecs/videnc_copy
  15. mysqldump: Got error: 1168 differently defined non-MyISAM LOCK TABLES
  16. 外接显示器显示“HDMI电缆没有连接”怎么办?
  17. java 微信公众号发红包_【微信支付】现金红包开发者文档
  18. TableauBDP,哪个才是最适合中国用户的数据可视化分析工具?
  19. 史上讲解最好的 Docker 教程,从入门到精通(建议收藏的教程)
  20. 数据挖掘与数据化运营实战

热门文章

  1. App测试流程思维导图
  2. CSDN 创始人蒋涛对话北大谢涛:AI 正在变革软件工程
  3. 2023.6.14每日一题
  4. vue在行内标签中动态添加背景图片,还有其他样式
  5. PowerDesigner 简单使用教程
  6. syncthing注册为系统服务开机自启动
  7. 北京金融局局长:把ICO合法化是幻想,支持无币区块链发展
  8. vijos1071:新年趣事之打牌
  9. Mysql字符串截取
  10. html+css京东电商页面