c++:*与&, *&p, 指针传递,引用传递,数组形参

本文详细解释了C++中的指针和引用,包括取地址运算符(&)和解引用运算符(*)的用法。通过实例展示了如何使用指针存储和修改变量的地址,以及指针作为函数参数时的传递机制。同时,对比了引用作为函数参数时的特点,强调其作为变量别名的特性,以及在函数调用中对原变量的影响。此外,还探讨了数组与指针的关系,说明数组名在函数调用中实际转化为指针的行为。

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

*与&

先理解地址和数据,想象内存里面是一个个的小盒子,每个盒子对应一个编号,这个编号就是地址,盒子里存放的就是数据。

&是取地址运算符,如有 int a; 即有一个小盒子里面存放的数据起名叫a,&a就是取a的地址,即该盒子的编号。

(地址)是取值运算符,这里是解引用操作符,可以理解成打开对应地址编号的盒子,取出里面的数据。(&a) 就是打开a对应的小盒子,取出里面的数据,即(&a)和a等价。

我们定义一个指针变量int *p; p是指针变量,专门用来存放地址。

int a = 10;
int *p=&a;//相当于int *p; p=&a; 单独 p 的值表示指向a的地址
*p = 5; //把p指向的地址,解引用(拆开编号&a地址的盒子,里面a的值赋值为5)

p存放的是a的地址,*p也等价于 a。指针变量p既然是变量,也同变量a一样对应一个小盒子,也有一个地址编号,&p就是取指针p的地址。

*&p

int a=123;
int *p=&a;
cout<<"*&p: "<<*&p<<endl;
    //&p是一个内存地址,*&p表示&p指向地址内存空间的值,在这里表示a的地址

*&p = (&p) = p
p是指针,&p为p的地址 (取包有内容p的盒子的编号)
再进行
解引用(拆开盒子),所以得到 *&p = p

指针传递

形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。

实参出现在主调函数中,进入被调函数后,实参变量也不能使用。

void test(int *a) {
*a += 3;
cout << “a所指向地址:” << a << “\n”
<< “a的地址:” << &a << “\n”
<< “a所指向地址的值:” << *a << “\n”;
}
void main()
{
int b = 10;
test(&b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}

在这里插入图片描述
形参int *p ,实参为传入地址

引用传递

void test(int &a) {
a += 3;
cout << “a的值:” << a << “\n”
<< “a的地址:” << &a << “\n”;
}
void main()
{
int b = 10;
test(b);
cout << “b的值:” << b << “\n”
<< “b的地址:” << &b << “\n”;
}

在这里插入图片描述
相当于变量的别名,函数内后续的任何改变都会影响原变量

数组形参

当要使用数组作为函数形参时,因为一个数组不能使用另外一个数组初始化,也不能将一个数组赋值给另外一个数组,而在“1.1 非引用形参”中提到要用实参的副本来初始化形参,所以实参为数组时,不能直接传递给形参。

例如一个函数的作用是找出数组中的最大数,数组为该函数的参数,则可以用如下三种方式定义该函数:

int FindMax(int* array);
int FindMax(int array[]);
int FindMax(int array[10]);

虽然不能直接传递数组,但是函数的形参可以写成数组的形式。此时,调用该函数是的实参数组被编译器自动转换为指针,也就是说,以上三种定义是等价的,其参数类型都是int*。

调用该函数时,直接将数组名称作为实参即可。

int array_my[5] = {1, 2, 3, 4, 5};
int array_maxvalue = FindMax(array_my);

可以百度数组与指针关系

#include <iostream>
 
using namespace std;
const int MAX = 3;
 
int main ()
{
   int  var[MAX] = {10, 100, 200};
   int  *ptr;
 
   // 指针中的数组地址
   ptr = var;
   for (int i = 0; i < MAX; i++)
   {
      cout << "var[" << i << "]的内存地址为 ";
      cout << ptr << endl;
 
      cout << "var[" << i << "] 的值为 ";
      cout << *ptr << endl;
 
      // 移动到下一个位置
      ptr++;
   }
   return 0;
}

输出

var[0]的内存地址为 0x7fff59707adc
var[0] 的值为 10
var[1]的内存地址为 0x7fff59707ae0
var[1] 的值为 100
var[2]的内存地址为 0x7fff59707ae4
var[2] 的值为 200
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

四夕立羽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值