C++指针变量的基本写法
2021-04-14 03:27
标签:color printf bsp 赋值 格式 扫描 维数 body 解释 在C++中,有一种神奇的变量,它不可以表示一个值,但是可以表示某个元素的地址,通过地址来访问这个元素。 打个比方:你有一张地图和一个坐标,你就可以通过访问这个坐标来达到你访问坐标所表示的元素的目的。指针变量就是这个“坐标”。 下面我们来具体看看指针变量的应用。 正如上面所说,指针变量不可以表示一个值,但是可以指向别的元素的地址,通过这个地址来间接访问这个元素的值。 由于它的性质,指针变量不可以直接=一个元素,赋值时要注意。 具体操作下面会讲到。 如何声明一个指针变量? 有如下表达式: 数据类型+“*”+指针名 通常我们这样赋值: 这样我们就定义了一个指针类型的变量p,NULL是空内存,这个内存里什么元素都没有,你可以之后再给p赋一个元素的地址。(可以不用=NULL,但是这是个人习惯,类似于return 0好习惯这种……) 这个语句的意义是:定义一个int类型的指针p,指向空地址。 那么怎么把一个元素的地址赋给一个指针变量呢? 有如下语句: 上面两个主函数的效果是一样的。 我们说说这两段代码的意义: 相信大家都用过scanf( ),在我们输入变量名前要加一个符号“&”,这就是地址符,表示变量名的地址。 我们的指针要指向一个地址,当然就是:指针名=&变量名啦! 既然我们会赋值了,下一步就是调用元素值,但是指针指向的是一个地址,不能直接参与运算,这时候我们要用到间接运算符“*”。(就是定义的时候那个星号) 如果我们有一个元素a,需要用指针来输出它,怎么操作? 对于这个问题,有如下程序: 代码注释已经很详尽了,我们的指针指向一个元素,用“*”+指针名即可访问指针所指元素 注意:通过指针操作元素值和直接操作元素值是一样的,比如下面这段代码: 程序给出的结果是30 200。 首先我们给出一个基本的定义: 当我们定义数组的时候,系统会给出连续的地址,比如a[5],假设a[0]的地址是0,那么a[1]的地址就是1……以此类推。 此时,我们直接把地址+1(指针+1),就可以访问数组的下一个元素。 对于p--,同理。这个语句输出了a[ ]中的所有变量。 指向数组的指针叫数组指针,众所周知,一个数组的地址是连续的,首地址就是他所占有的几个单元的首地址,我们可以把数组名赋给指针,也可以把数组中某个元素的地址赋给它。 有以下语句: 则以下三个语句 &a[0],a,*p,均指向同一个单元——数组的首地址。 那么可以推导:&a[i]、a+i、p+i,均指向数组a中a[i]的地址。 有如下代码: 我们输如5个数:1 2 3 4 5 系统给出了5行: 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 这说明上面4个语句:*(pa+i),pa[i],a[i],*(a+i)是等价的。 代码说明和注意事项: 1、a(数组名)可以加“*”变为常量指针,a是开始元素,根据指针的加减原理,a+i是第i个元素的地址。 2、a是常量名,不能直接进行指针的+、-操作(这里指的是p++、p--这种赋值操作非法,但是a+i这种是合法的),但是pa是指针变量,可以进行加减操作。 我们用如下语句可以申请一个系统空间给指针p: 此时*p的内容不确定。 这个语句是动态数组的基础。 1、原理:之前说过,如果我们一次申请多个空间,系统会发给我们连续的新地址,可以当做数组用。 2、具体操作 有如下代码: 如果我们输入: 5 1 2 3 4 5 系统给出 1 2 3 4 5 上面的代码你可以理解有一个数组,数组名就是指针名,其余操作和第5个板块中提到的一样。(通过数组名+下标访问) 我们还可以改成这个样子: 这里使用指针访问而不使用数组名访问,和上面的代码是等价的。当然你也可以写成这样:printf("%d ",*(p+i));在上面提到过,这几种写法是等价的。 前面扯了那么多指针的基本定义和写法,终于到了今天的正题了——利用指针建立动态数组。 我们给出一个情景:现在有一个巨大(行列
显然,这样的代码是绝对行不通的。 如果这么写,你的空间复杂度是绝对过不了的。 我们要进行优化才行。 记得指针可以申请空间吗?我们可以利用这个特性,避免存储无效数据(0),我们为每一次输入的有效数据开一个新的内存单元,这样就不会爆内存啦! 我们看下面这个例题: 【问题描述】 矩阵可以认为是N*M的二维数组。现在有一个巨大但稀疏的矩阵。 N,M的范围是1
矩阵输入的方式是从上到下(第1行到第N行),从左到右(从第1列到第M列)扫描,记录有数据的坐标位置(x,y)和值(v)。这是按照行优先的方式保存数据的。 现在要求按照列优先的数据,即从左到右,从上到下扫描,输出有数据的坐标和位置。 【输入格式】 第1行:3个整数N,M,K,其中1
【输出格式】 1行,K个整数,是按照列优先次序输出的数 【样例输入】 4 5 9 1 2 12 1 4 23 2 2 56 2 5 78 3 2 100 3 4 56 4 1 73 4 3 34 4 5 55 【样例输出】 73 12 56 100 34 23 56 78 55 【样例解释】 对于这个矩阵,我们可以这样存: 注:标记“------”的都是没有使用的内存,这样我们就节省了11个内存单元,对于大数据的时候,我们还能节省更多的内存,保证不会超出空间限制。 这个思路的大体意思就是:忽略x的值,把第y列第一次输入的数据当做第y列的第一个数据,然后是第二个…… 下面来看代码实现: a[i]=new int c[[i]];这一句的意思是给a[i]这个指针新申请c[i]个空间,等同于我们开了LP个一维的指针数组,这些数组每一个都有一个专用的指针a[i],每个数组有c[i]个元素。 到这里,我们已经讲完了利用指针开动态数组数组的具体做法,这样可以很有效率的优化你的程序,赶紧用起来吧!!! C++指针变量的基本写法 标签:color printf bsp 赋值 格式 扫描 维数 body 解释 原文地址:https://www.cnblogs.com/zaza-zt/p/12938121.html指针变量与应用——动态数组
1、指针变量的性质
2、指针变量的声明
int main()
{
int *p=NULL;
return 0;
}
#include
3、用指针变量调用元素值
#include
#include
4、指针的+、-运算
#include
5、指针与数组
int a[5],*p=a;
#include
6、指针申请系统空间
int *p=new(int);
7、用指针当数组名
#include
#include
8、动态数组与空间复杂度优化
#include
一本通例题8.7:
0
12
0
23
0
0
56
0
0
78
0
100
0
56
0
73
0
34
0
55
73
12
34
23
78
——
56
——
56
55
——
100
——
——
——
——
——
——
——
——
#include