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

2023-08-24 15:09:03 浏览数 (1)

*与&

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

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

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

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

代码语言:javascript复制
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

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

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

指针传递

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

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

代码语言:javascript复制
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 ,实参为传入地址

引用传递

代码语言:javascript复制
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 非引用形参”中提到要用实参的副本来初始化形参,所以实参为数组时,不能直接传递给形参。

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

代码语言:javascript复制
int FindMax(int* array);
int FindMax(int array[]);
int FindMax(int array[10]);

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

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

代码语言:javascript复制
int array_my[5] = {1, 2, 3, 4, 5};
int array_maxvalue = FindMax(array_my);

可以百度数组与指针关系

代码语言:javascript复制
#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;
}

输出

代码语言:javascript复制
var[0]的内存地址为 0x7fff59707adc
var[0] 的值为 10
var[1]的内存地址为 0x7fff59707ae0
var[1] 的值为 100
var[2]的内存地址为 0x7fff59707ae4
var[2] 的值为 200

0 人点赞