C++【4】指针与引用;数组指针;指针数组

/*
    指针变量作为函数参数
        函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。
        指针变量作为函数参数与变量本身作为函数参数不同,变量作函数参数传递的是具体值。
        而指针作为函数参数传递的是内存的地址
*/


#include<iostream>  //C++ 标准输入输出流头文件
using namespace std;void swapfunc(int *p1,int *p2)  //将地址里面的值进行交换
{int    temp = 0;temp = *p1;*p1 = *p2;     *p2 = temp;
}int main()
{int a,b;int *pa,*pb;cout << "请输入 a b 的值:"<<endl;cin  >> a >> b ;pa = &a;pb = &b;if (a<b)swapfunc(p1,p2)cout << "a=" << a   << ",b=" << b << endl;cout << *pa  << "," << *pb    <<endl;return 0;
}

指向数组元素的指针的定义与赋值

int a[10], *p;

p =  &a[0];  //数组第一个元素的地址

p = a; //直接用数组名赋值   p是变量 ,a 是常量

若数组元素为int型,则指向其的指针变量也对应为int型

如: int a[10];

则:int *p = a;         int  *p = &a[0];   //这是两种情况,且均为赋初值

通过指针引用数组元素

int a[10];

int *p =a;  //为指针变量赋初值

* p = 1;  a[0] = 1 ; //通过指针变量为数组元素赋值

C++规定,p+1指向数组的下一个元素,而不是下一个字节。

如: *(p+1) = 2;          a[1] = 2;

 *++p = 2;         p=p+1; //指针变量也重新赋值         *p=2;

#include<iostream>  //C++ 标准输入输出流头文件
using namespace std;int main()
{int a[5] = {12,30,66,55,22} int *p = a; //将数组的第一个元素首地址赋给指针变量p  p = &a[0]  12cout << "a[0] =  " << *p << endl;*p = 33;cout  << "a[0]"  << *p <<  endl;cout << "结果为:" << *(p+1) << endl; // 30   return 0;
}

取地址与取值的区别 

#include <iostream>using namespace std;int main() 
{int  max  =   66;int  &remax =  max;cout << "max的地址是:" << &max << endl;cout << "remax的地址是:" << &remax <<endl;cout <<"\n\n max的值= " << max << endl;cout <<"remax的值= " << remax <<endl;return 0;
}

对引用类型的变量,说明以下几点:

1.引用在定义的时候要初始化。

int  &remax ; // 错误,没有具体的引用对象

int &remax = max ; //max是已经定义过的变量

2.对引用的操作就是对被引用的变量的操作。

3.引用类型变量的初始化不能是一个常数。

如:int &refl = 5 ;//是错误的

int &refl =i;

4.引用同变量一样有地址,可以对其地址进行操作,即将其地址赋给一指针

int a,*p;

int &m = a;   //&是变量的引用

p = &m;

*p = 10;   //&是变量的地址

5.可以用动态分配的内存空间来初始化一个引用变量

 float &reff  =  * new  float ;   //用new开辟一个空间,取一个别名reff

 reff = 200;                            //给空间赋值    

 cout << reff<<endl;;             //输出200

 delete &reff;                        //收回这个空间

6.指针与引用的区别:

(1)指针是通过地址间接访问某个变量,而引用是通过别名直接访问某个变量。

(2)引用必须通过初始化,而一旦被初始化后不得作为其它变量的别名。

ps:当 &a 的前面有类型符时(如int &a),它必然是对引用的声明;如果前面无类型符(如cout<<&a),则是取变量的地址。

以下的声明是非法的:

(1).企图建立数组的引用                int &a[9];

(2).企图建立指向引用的指针        int &* p;

(3).企图建立引用的引用                int &&px;

7.对常量(用const声明)的引用

void main()

{

        const int &r = 8;  //说明r为常量,不可赋值

        cout <<"r= "<<r<<endl; 

        //r+=15 ;  //r为常量,不可作为赋值运算

        cout<<"r= "<<r<<endl; 

}

8.引用与函数

引用的用途主要是用来作函数的参数函数的返回值

引用作函数的形参,实际上是在被调函数中对实参变量进行操作

void change(int &x,int &y)     // x,y是实参a,b的别名  
{int t; t=x; x=y; y=z;
}void main(void)
{int a = 3, b = 5;change(a,b);          //实参为变量cout<< a << '\t' << b << endl; 
}

9.函数的返回值为引用类型

        可以把函数定义为引用类型,这时函数的返回值即为某一变量的引用(别名),因此,它相当于返回了一个变量,所以可对其返回值进行赋值操作。这一点类同于函数的返回值为指针类型。

#include<iostream>
using namespace std;int a = 4;
int &f(int x)   //函数返回a的引用,即a的别名
{a = a + x;return a;
}int main(int agrc,char *argv[])
{int t = 5;cout <<f(t)<<endl;f(t) = 20;cout <<f(t)<<endl;t = f(t);cout <<f(t)<<endl; return 0;
}

10.const类型常量

        当用const限制说明标识符时,表示所说明的数据类型为常量类型。可分为const型常量和const型指针。

可用const限制定义标识符量,如:

const         int        MaxLine = 666;

const         float      Pi = 3.1415926;

用const定义的标识符常量时,一定要对其初始化。在说明进行初始化是对这种常量置值的唯一办法,不能用赋值运算符对这种常量进行赋值。如:

                MaxLine = 35;

#include<iostream>
using namespace std;int main(int argc,char *argv[])
{int a = 3,b = 5 ;     const int *pa = &b;       //可以不赋初值pa = &a;                //指针变量可以重新赋值 cout << *pa <<endl;     //输出3// *pa = 10;            //非法,指针指向的内容不能赋值a = 100 ;                //变量可以重新赋值cout << *pa <<endl;      //输出100  return 0;
}//即不可以通过指针对变量重新赋值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/95175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW开发教学实验室自动化INL和DNL测试系统

LabVIEW开发教学实验室自动化INL和DNL测试系统 如今&#xff0c;几乎所有的测量仪器都是基于微处理器的设备。模拟输入量在进行数字处理之前被转换为数字量。对于参加电气和电子测量课程的学生来说&#xff0c;了解ADC以及如何欣赏其性能至关重要。ADC的不确定性可以根据其传输…

蓝桥杯每日一题2023.10.5

3420. 括号序列 - AcWing题库 题目描述 题目分析 对于这一我们需要有前缀知识完全背包 完全背包的朴素写法&#xff1a; #include<bits/stdc.h> using namespace std; const int N 1010; int n, m, v[N], w[N], f[N][N]; int main() {cin >> n >> m;fo…

PyTorch实例:简单线性回归的训练和反向传播解析

文章目录 &#x1f966;引言&#x1f966;什么是反向传播&#xff1f;&#x1f966;反向传播的实现&#xff08;代码&#xff09;&#x1f966;反向传播在深度学习中的应用&#x1f966;链式求导法则&#x1f966;总结 &#x1f966;引言 在神经网络中&#xff0c;反向传播算法…

利用python来打印九九乘法表

一. 打印九九乘法表 法一 # 定义起始行 row 1# 最大打印 9 行 while row < 9:# 定义起始列col 1# 最大打印 row 列while col < row:# end ""&#xff0c;表示输出结束后&#xff0c;不换行# "\t" 可以在控制台输出一个制表符&#xff0c;协助在输…

华为OD七日集训第6期 十一特辑 - 按算法分类,由易到难,循序渐进,玩转OD

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、优先队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治…

OpenCV 15(SIFT/SURF算法)

一、SIFT Harris和Shi-Tomasi角点检测算法&#xff0c;这两种算法具有旋转不变性&#xff0c;但不具有尺度不变性&#xff0c;以下图为例&#xff0c;在左侧小图中可以检测到角点&#xff0c;但是图像被放大后&#xff0c;在使用同样的窗口&#xff0c;就检测不到角点了。 尺度…

JavaScript操作CSS样式

上节课我们基本完成了游戏的主体&#xff0c;这节课我们来学习如果使用JavaScript去操作CSS样式 ● 例如&#xff0c;我们现在想当玩家输入对的数字之后&#xff0c;我们讲背景改为绿色&#xff0c;并且把number的框宽度变大 const secretnumber Math.trunc(Math.random() * …

经典算法-----汉诺塔问题

前言 今天我们学习一个老经典的问题-----汉诺塔问题&#xff0c;可能在学习编程之前我们就听说过这个问题&#xff0c;那这里我们如何去通过编程的方式去解决这么一个问题呢&#xff1f;下面接着看。 汉诺塔问题 问题描述 这里是引用汉诺塔问题源自印度一个古老的传说&#x…

目前制造企业生产计划现状是什么?有没有自动化排产系统?

大家都知道&#xff0c;人的指挥中心是大脑&#xff0c;大脑对我们的发出各种各样的指令&#xff0c;告诉我们&#xff1a;“手”做什么事情&#xff0c;“眼睛”看什么地方&#xff0c;“耳朵”听什么声音&#xff0c;然后再将摸到的、看到的、听到的信息传递给大脑&#xff0…

制作 3 档可调灯程序编写

PWM 0~255 可以将数据映射到0 75 150 225 尽可能均匀电压间隔

2023-09-27 Cmake 编译 OpenCV+Contrib 源码通用设置

Cmake 编译 OpenCV 通用设置 特点&#xff1a; 包括 Contrib 模块关闭了 Example、Test、OpenCV_AppLinux、Windows 均只生成 OpenCV_World 需要注意&#xff1a; 每次把 Cmake 缓存清空&#xff0c;否则&#xff0c;Install 路径可能被设置为默认路径Windows 需要注意编译…

安装PostgreSQL

PostgreSQL安装指南&#xff1a;从下载到配置 PostgreSQL是一款强大的开源关系型数据库管理系统&#xff0c;广泛用于企业和开发者的应用程序。在这篇博客中&#xff0c;我们将向您介绍如何安装和配置PostgreSQL&#xff0c;以便您可以开始使用这个强大的数据库。 步骤1&#…

maven下载、本地仓库设置与idea内置maven设置

一、下载安装maven maven下载官网&#xff1a;https://maven.apache.org/download.cgi 下载到本地后解压 二、配置环境变量 我的电脑-属性-高级系统设置-环境变量/系统变量 新建MAVEN_HOME 变量值为自己的maven包所在的位置 编辑path 添加 %MAVEN_HOME%\bin 三、测试 Win…

【Pytorch笔记】5.DataLoader、Dataset、自定义Dataset

参考 深度之眼官方账号 - 02-01 Dataloader与Dataset.mp4 torch.utils.data.DataLoader 功能&#xff1a;构建可迭代的数据装载器。 data.DataLoader(dataset,batch_size1,shuffleFalse,samplerNone,batch_samplerNone,num_workers0,collate_fnNone,pin_memoryFalse,drop_la…

一个案例熟悉使用pytorch

文章目录 1. 完整模型的训练套路1.2 导入必要的包1.3 准备数据集1.3.1 使用公开数据集&#xff1a;1.3.2 获取训练集、测试集长度&#xff1a;1.3.3 利用 DataLoader来加载数据集 1.4 搭建神经网络1.4.1 测试搭建的模型1.4.2 创建用于训练的模型 1.5 定义损失函数和优化器1.6 使…

JDK8 Stream测试

如何创建一个流Stream&#xff0c;三种方法&#xff1a;测试 1、通过 java.util.Collection.stream() 2、通过数组来创建流 3、静态方法&#xff1a;使用Stream的静态方法&#xff1a;of()、iterate()、generate() public class StreamJ {public static void main(String[] arg…

redis持久化与调优

一 、Redis 高可用&#xff1a; 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#x…

POJ 2886 Who Gets the Most Candies? 树状数组+二分

一、题目大意 我们有N个孩子&#xff0c;每个人带着一张卡片&#xff0c;一起顺时针围成一个圈来玩游戏&#xff0c;第一回合时&#xff0c;第k个孩子被淘汰&#xff0c;然后他说出他卡片上的数字A&#xff0c;如果A是一个正数&#xff0c;那么下一个回合他左边的第A个孩子被淘…

通过usb串口发送接收数据

USB通信使用系统api&#xff0c;USB转串口通信使用第三方库usb-serial-for-android&#xff0c; 串口通信使用Google官方库android-serialport-api。x 引入包后在本地下载的位置&#xff1a;C:\Users\Administrator\.gradle\caches\modules-2\files-2.1 在 Android 中&#x…

【python海洋专题十一】colormap调色

【python海洋专题十一】colormap调色 上期内容 本期内容 图像的函数包调用&#xff01; Part01. 自带颜色条Colormap 调用方法&#xff1a; cmap3plt.get_cmap(ocean)查询方法&#xff01; Part02. seaborn函数包 01&#xff1a;sns.cubehelix_palette cmap5 sns.cu…