1. 如何理解视频中的 linesize
??
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的值。大多数编程语言中用同一个符号表示这两个东西,而由编译器根据上下文环境判断它的含义。如下图
- 上文中的x指的是x所代表的地址,而y的含义是y的内容。
- 出现在赋值符号左边的值称为左值、赋值符号右边的称为右值。编译器为每个变量分配地址(左值)。这个地址在编译时可知且一直存在,而它的右值在运行时才能知道。通俗说:每个变量都有一个地址,这个地址在编译时可以知道,而地址里存储的内容(也就是变量的值)只有在运行时才能知道。如果需要用到变量的值,(也就是已知地址存储的值)那么编译器发出指令从指定地址读入变量值并放入相应寄存器中。
3. 直接使用数组名字
访问数组元素的过程
- ① a 所代表的地址就是 9980 ② (9980+i)即可获得需要访问的数据
4. 使用数组指针
访问数组元素的过程
- ①指针 p 所在的地址是 4624 ②取出地址 4624 所存储的地址 5081 ③(5081+i)即可获得需要访问的数据
5. 总结 数组名字
和 数组指针
访问数组元素过程的区别?
- 如果是数组 a[],那么可以直接用数组名来访问数组中的元素,因为它的内容就是第一个元素,他的下一个地址也就对应了下一个元素的地址。
- 如果是指针 *a,先要取出 a 的内容,再把它作为变量的地址并从这个地址中取得变量的内容。
5. C 语言的数组形参是指针吗?为什么?(非常重要)
- C 语言会把数组形参当成
指针
- 把作为形参的数组当做指针来考虑其实是出于效率考虑。C 语言汇总,所有非数组形式的数据实参均为
值传递形式
。 - 而对于数组,如果每次调用函数都要拷贝整个数组的话,就会花费大量的性能和空间开销,所以对于数组,C 语言的机制是告诉函数数组的首地址,直接对数组进行操作。