{C++善于利用指针与引用}菜大学生C++笔记19

本文介绍了C++中的指针与引用概念,包括指针的定义、用途、内存大小、类型限制以及指针运算。同时阐述了引用作为安全的指针替代品的特性,如不可赋值为NULL及必须在定义时初始化。此外,文中还探讨了如何使用指针进行变量交换,并对比了不使用指针实现变量交换的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第6章 善于利用指针与引用


6.1 什么是指针
1 变量里存的是内容,这个内容在何处?
在这里插入图片描述
在内存中申请了一段空间。我们用a来标识,把5赋值,20赋值。A与内存的一段地址相关系。
在这里插入图片描述
2 如何看变量的内容与地址?
内容与地址不同,定义一个变量后。只要程序未结束,地址不会变。而内容可变。
变量 内容 地址 int a=5 ; a=20
酒店 客户 房间号 张三住在305; 李四住在305

3 直接访问与间接访问某个变量。
如果用一个变量获得另一个变量的地址。可能用两种方法访问变量。
#include < iostream>
using namespace std;
int main()
{
int a=5;
cout<<a<<endl; //直接访问
int *p=&a;//变量p得到了a的地址
cout<<*p<<endl; //间接访问
return 0;
}

6.2 变量与指针
1 特殊的变量类型,指针变量。
原来所学的每个变量都是存数的。
特殊的变量用于存储变量的地址----》指针变量。
2 定义指针变量 (不是变量名的一部分)
基类型 变量名;
在这里插入图片描述在定义时,变量名前加
,表示此变量是一个指针变量。
变量名为p,不是
p;
3 所有的指针变量占据内存大小都相同。
在64位devC++ 每个指针变量占8个字节
在vs2010中,每个指针变量占4个字节。
在这里插入图片描述
在这里插入图片描述

为什么指针变量所占内存大小 相同。地址 类似于房间号。
房间有大小,房间号位数都相同。
4 指针变量是存地址的,未赋值之前不允许通过指针变量赋值。
在这里插入图片描述
在这里插入图片描述
5 在定义指针变量时赋值与定义后赋值形式上的不同。
#include < iostream>
using namespace std;
int main()
{
int a,*pa;
int b,*pb=&b;//在定义时赋值,把b的地址赋值给pb
pa=&a;//在定义后赋值,把a的地址赋值给pa;
int c;
a=20;
b=30;
c=a+b;
cout<<c<<endl;
*pa=2;//在定义后 *pa表示取pa所指示单元的值
*pb=4;
cout<<“a=”<<a<<endl;
cout<<“b=”<<b<<endl;
return 0;
}
6 如何查看一个变量所占内存为几个字节(sizeof运算符)
7 既然所有的指针变量所占内存大小都相同,那类型有什么用?
指针变量的类型 --》基类型(表明,此变量可以存储什么样地址。
int *pa; pa的基类型为int,只能存储 int型地址
double *q; q的基类型为double,只能存储double型的地址。
在这里插入图片描述

a占据的内存单元是fe3c。是不是一个字节。Fe3d 3e 3f
d占据的内存单元fe30,是不是一个字节?,也不是。8个字节30,31,。。。37
指针变量的基类型,表示,从这个地址处,连续几个字节归指针变量管。
8 不允许给指针变量赋整数(除了初始化为NULL)。
在这里插入图片描述
int *p=NULL; 实际赋值为0,表示指针变量未指向任何地址
9 指针变量一旦定义,只能指向与基类型相同的变量地址。
10 有关指针运算的两个运算 (&取地址 *取地址处的内容)
在定义时用不到 &.
在定义时 * 表示此变量是一个指针变量
在定义后 & 取地址 *取地址处的内容
11 两个指针变量可以指向同一个变量吗?
在这里插入图片描述
三个服务员得到同一个房间号,服务时是同一个房间。

例(输入a和b两个整数,按先大后小的顺序输出a和b(用指针变量处理)) (方法:使用两个指针变量指向a,b. 比较后,使其中一个指针指向大数,另一个指向小数。两个变量不变)
在这里插入图片描述
在这里插入图片描述
12 不使用指针变量,能否写一个函数交换两个变量的值?
在这里插入图片描述传递参数a—》x b-(y 传递是一种单向传递。A与x b与y占据的是不同的内存空间
改变了x不会影响 a
13 使用指针变量,能否写一个函数交换两个变量的值?
在这里插入图片描述

#include< iostream>
using namespace std;
int main()
{
void swap(int *p1,int *p2);
int *pointer_1, *pointer_2,a,b;
cin>>a>>b;
pointer_1=&a;
pointer_2=&b;
if(a<b)swap(pointer_1,pointer_2);
cout<<“max=”<<a<<" min="<<b<<endl;
return 0;
}
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C0ntr01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值