音视频 day21 数组和指针的区别、值传递和地址传递

366 阅读3分钟

1. 如何理解视频中的 linesize ??

image.png

2. C 语言中的 long 是什么类型?浮点型用什么表示?

  • long 是整型,是 long int 的缩写
  • 浮点型用 float、double 表示

二、C++ 值传递、指针传递、引用传递

1. 简述什么是值传递?

  • 形参是实参的拷贝,改变形参的值并不会影响外部实参的值。
  • 从被调用函数的角度来说,值传递是单向的(实参-->形参),参数的值只能传入,不能传出。

2. 简述什么是指针传递?

  • 形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

3. 简述什么是引用传递?

  • 形参相当于是实参的别名,对于形参的操作其实就是对实参的操作。

4. 如果对值传递、指针传递、引用传递概念模糊的时候,建议练习一下下面的代码?

#include <iostream>

using namespace std;

// 值传递
void change1(int n) {
 cout << "值传递--函数操作地址:" << &n << endl;
 n++;
}

// 引用传递
void change2(int &n) {
 cout << "引用传递--函数操作地址:" << &n << endl;
 n++;
}

// 指针传递
void change3(int *n) {
 cout << "指针传递--函数操作地址:" << n << endl;
 *n = (*n + 1);
}

int n = 10;
int main(){
 
 cout << "实参的地址" << &n << endl;
 change1(n);
 cout<<"after change1() n="<<n<<endl;
 change2(n);
 cout<<"after change2() n="<<n<<endl;
 change3(&n);
 cout<<"after change3() n="<<n<<endl;
 
 int *p = &n;
 cout << "p:" << p << endl;
 
 change3(p);
 cout<<"after change3() n="<<n<<endl;
 
 return 0;
}

三、从访问角度上看待数组和指针的区别?

1. What's a Declaration? What's a Definition? 在 C 语言中,什么是声明?什么是定义?

  • 声明 Declaration:描述在其他地方创建的对象,并不分配内存。(可以出现在多个地方)
  • 定义 Definition:产生一个新的对象,并分配内存。(只能出现一次)

2. 注意一下 “地址y” 和 “地址y的内容” 的区别?

“地址y” 表示变量y在内存中的地址,而 “地址y的内容” 指的是位于这个地址中的内容,也就是变量y的值。大多数编程语言中用同一个符号表示这两个东西,而由编译器根据上下文环境判断它的含义。如下图

image.png

  • 上文中的x指的是x所代表的地址,而y的含义是y的内容。
  • 出现在赋值符号左边的值称为左值、赋值符号右边的称为右值。编译器为每个变量分配地址(左值)。这个地址在编译时可知且一直存在,而它的右值在运行时才能知道。通俗说:每个变量都有一个地址,这个地址在编译时可以知道,而地址里存储的内容(也就是变量的值)只有在运行时才能知道。如果需要用到变量的值,(也就是已知地址存储的值)那么编译器发出指令从指定地址读入变量值并放入相应寄存器中。

3. 直接使用数组名字访问数组元素的过程

image.png

  • ① a 所代表的地址就是 9980 ② (9980+i)即可获得需要访问的数据

4. 使用数组指针访问数组元素的过程

image.png

  • ①指针 p 所在的地址是 4624 ②取出地址 4624 所存储的地址 5081 ③(5081+i)即可获得需要访问的数据

5. 总结 数组名字数组指针 访问数组元素过程的区别?

  • 如果是数组 a[],那么可以直接用数组名来访问数组中的元素,因为它的内容就是第一个元素,他的下一个地址也就对应了下一个元素的地址。
  • 如果是指针 *a,先要取出 a 的内容,再把它作为变量的地址并从这个地址中取得变量的内容。

5. C 语言的数组形参是指针吗?为什么?(非常重要)

  • C 语言会把数组形参当成指针
  • 把作为形参的数组当做指针来考虑其实是出于效率考虑。C 语言汇总,所有非数组形式的数据实参均为值传递形式
  • 而对于数组,如果每次调用函数都要拷贝整个数组的话,就会花费大量的性能和空间开销,所以对于数组,C 语言的机制是告诉函数数组的首地址,直接对数组进行操作。