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.xdnf.cn/news/149034.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

QT4.8.7安装详细教程

QT4.8.7安装详细教程&#xff08;MinGW 4.8.2和QTCreator4.2.0&#xff09; 1.下载及安装2.配置环境 此文是在下方链接博文的基础上&#xff0c;按自己的理解整理的https://blog.csdn.net/xiaowanzi199009/article/details/104119265 1.下载及安装 这三个文件&#xff0c;顺序是…

Swift SwiftUI CoreData 过滤数据 1

Xcode: Version 14.3.1 (14E300c) iOS: 16 预览&#xff1a; Code: import SwiftUI import CoreDatastruct TodosSearch: View {State private var search_title "测试"FetchRequest var todos_search: FetchedResults<Todo>init() {let request: NSFetchReq…

Cortex-A9 架构

一、Cortex-A 处理器运行模式 Cortex-A9处理器有 9中处理模式&#xff0c;如下表所示&#xff1a; 九种运行模式 在上表中&#xff0c;除了User(USR)用户模式以外&#xff0c;其它8种运行模式都是特权模式&#xff0c;在特权模式下&#xff0c;程序可以访问所有的系统资源。这…

在openwrt dnsmasq DHCP中为客户端分配不同的网关和DNS | 旁路由 禁止上网

环境&#xff1a;openwrt dnsmasq PS4/Switch 问题&#xff1a;为路由器下的设备分配不同的网关和DNS&#xff0c;禁止局域网设备上网 解决办法&#xff1a;修改dnsmasq配置文件 背景&#xff1a;Openwrt 的DHCP服务是使用dnsmasq实现的&#xff0c;他可以给内网的客户端设备…

网络安全工程师考证指南,不看就亏了!!

目前网络安全行业&#xff0c;国内都有哪些证书可以考&#xff1f; 一、CISP-PTE &#xff08;国家注册渗透测试工程师&#xff09; CISP-PTE即注册信息安全渗透测试工程师&#xff0c;该证书由中国信息安全测评中心颁发&#xff0c;证书是国内唯一认可的渗透测试认证&#x…

el-menu 导航栏学习(1)

最简单的导航栏学习跳转实例效果&#xff1a; &#xff08;1&#xff09;index.js路由配置&#xff1a; import Vue from vue import Router from vue-router import NavMenuDemo from /components/NavMenuDemo import test1 from /components/test1 import test2 from /c…

Redis中Hash类的操作

Redis中Hash类型是键值对的形式保存数据&#xff0c;其中键被称为字段&#xff08;field&#xff09;&#xff0c;值称为字段值&#xff08;value&#xff09;。在一个key中&#xff0c;字段不能重复&#xff0c;而值可以重复。无论是字段还是值都是无序的&#xff08;保存的次…

mysql双主+双从集群连接模式

架构图&#xff1a; 详细内容参考&#xff1a; 结果展示&#xff1a; 178.119.30.14(主) 178.119.30.15(主) 178.119.30.16(从) 178.119.30.17(从)

添加驱动模块到内核的两种方法

添加驱动模块到内核的两种方法 1. 放在内核源代码树中 步骤总结&#xff1a; 新建文件夹编写Makefile、编写Kconfig修改上层Kconfig执行make menuconfig执行make zImage 或 make modules 1.1 源码放入文件夹 例如&#xff1a;添加一个按键字符设备模块 在内核目录下的 dri…

【推荐系统】多任务学习模型

介绍一些多任务学习模型了解是如何处理多任务分支的。 ESSM, Entire Space Multi-Task Model 阿里提出的ESSM全称Entire Space Multi-Task Model&#xff0c;全样本空间的多任务模型&#xff0c;有效地解决了CVR建模&#xff08;转化率预估&#xff09;中存在的两个非常重要…

MATLAB中plot3函数用法

目录 语法 说明 向量和矩阵数据 表数据 其他选项 示例 绘制三维螺旋图 绘制多个线条 使用矩阵绘制多个线条 指定等间距刻度单位和轴标签 将点绘制为不带线的标记 自定义颜色和标记 指定线型 在绘图后修改线条 绘制表中的数据 在 x 和 y 轴上绘制多个表变量 指…

10.2 调试事件获取DLL装载

理解了如何通过调试事件输出当前进程中寄存器信息&#xff0c;那么实现加载DLL模块也会变得很容易实现&#xff0c;加载DLL模块主要使用LOAD_DLL_DEBUG_EVENT这个通知事件&#xff0c;该事件可检测进程加载的模块信息&#xff0c;一旦有新模块被加载或装入那么则会触发一个通知…

Qt扫盲-QSqlTableModel理论总结

QSqlTableModel理论总结 一、概述二、使用1. 与 view 视图绑定2. 做中间层&#xff0c;不显示 三、常用函数 一、概述 QSqlTableModel是用于从单个表读写数据库记录的高级接口。它构建在较低级的QSqlQuery之上&#xff0c;可用于向QTableView 等视图类提供数据。这个主要是对单…

苹果V3签名是什么?优势是什么?什么场合需要应用到?该怎么部署?

v3签名&#xff0c;或称为Apple Developer Program v3签名&#xff0c;是苹果公司在2021年6月推出的一种签名格式&#xff0c;用于对应用程序进行签名和验证。 它是取代了之前的v2签名格式&#xff0c;用于增强应用程序的安全性和完整性。 v3签名能够做到以下几点&#xff1a;…

【Linux基础】Linux发展史

&#x1f449;系列专栏&#xff1a;【Linux基础】 &#x1f648;个人主页&#xff1a;sunny-ll 一、前言 本篇主要介绍Linux的发展历史&#xff0c;这里并不需要我们掌握&#xff0c;但是作为一个合格的Linux学习者与操作者&#xff0c;这些东西是需要了解的&#xff0c;而且…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(五)

思维导图 Bom操作 一、Window对象 1.1 BOM(浏览器对象模型) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"vi…

k8s集群-6(daemonset job cronjob控制器)

Daemonset 一个节点部署一个节点 当有节点DaemonSet 确保全部 (或者某些) 节点上运行一个 Pod 的副本。加入集群时&#xff0c;也会为他们新增一个 Pod 。当有节点从集群移除时&#xff0c;这些Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。 DaemonSet 的典型用…

Boost程序库完全开发指南:1.1-C++基础知识点梳理

主要整理了N多年前&#xff08;2010年&#xff09;学习C的时候开始总结的知识点&#xff0c;好长时间不写C代码了&#xff0c;现在LLM量化和推理需要重新学习C编程&#xff0c;看来出来混迟早要还的。 1.shared_ptr 解析&#xff1a;shared_ptr是一种计数指针&#xff0c;当引…

数字电路逻辑与设计 之循环码和 移存码

有发现错误的能力&#xff0c;不能纠正 只能检查单次的错误&#xff0c;不能完全抗干扰 可以按照上面的方法来循环构造 移存码可以通过前推后推来实现

pycharm配置python3.8版本专门用于undecteded_chromedriver测试

pycharm配置python3.8版本专门用于undecteded_chromedriver测试 作者&#xff1a;虚坏叔叔 博客&#xff1a;https://pay.xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、Pycharm及python环境的配置 1.安装python-3.8.7rc1-amd64.e…