**
更新时间:2020-09-10
**
温故而知新,每次重温一遍知识点,都有新的见解。
参考:
首先需要了解程序的内存是如何分配的
C/C++程序内存的各种变量存储区域和各个区域详解
栈区(stack):由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。
堆区(heap):一般由程序员自动分配,如果程序员没有释放,程序结束时可能有OS回收。其分配类似于链表。
全局区(静态区static):存放全局变量、静态数据、常量。程序结束后由系统释放。全局区分为已初始化全局区(data)和未初始化全局区(bss)。
常量区(文字常量区):存放常量字符串,程序结束后有系统释放。
代码区:存放函数体(类成员函数和全局区)的二进制代码。
//main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b;// 栈
char s[] = "abc"; //"abc"在常量区,s在栈上。
char *p2; //栈
char *p3 = "123456"; //123456\0";在常量区,p3在栈上。
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
//分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}
C++ 什么时候使用指针?什么时候使用引用?什么时候应该按值传递?
3种传递的区别代码:
//值传递
//void mySwap(int a, int b)
//{
// cout << "mySwap:\t&a = " << &a << ", \t&b = " << &b << endl;
//}
//指针传递
void mySwap(int *a, int *b)//开辟了新的内存
{
cout << "mySwap:\t&a = " << &a << ", \t&b = " << &b << endl;
cout << "mySwap:\ta = " << a << ", \tb = " << b << endl;
}
//引用传递
//void mySwap(int &a, int &b)
//{
// cout << "mySwap:\t&a = " << &a << ", \t&b = " << &b << endl;
//}
int main()
{
int n = 15, m = 20;
cout << "before:\t&n = " << &n << ", \t&m = " << &m << endl;
cout << endl;
// 如果是传指针请用这种方式调用:
mySwap(&n, &m);
//mySwap(n, m);
system("pause");
return 0;
}
函数使用:
需要修改值 | 不需要修改值 |
---|---|
指针/引用 | 值传递/引用 |
~持续更新