*与&
先理解地址和数据,想象内存里面是一个个的小盒子,每个盒子对应一个编号,这个编号就是地址,盒子里存放的就是数据。
&是取地址运算符,如有 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