有关一些存储结构—Part1

小声嘀咕:本文只整理了一些注意点(小编自个儿不会的地儿~),若需要详细内容还请大ga去另寻大佬。。。。

1.数组创建与初始化

int[] arr = … /初始化数组,申请足够空间(因为数组占用一段连续存储的空间)/

在存储数组时,存储的为数组第一个元素的地址

注:除数组外,其他存储结构(链表,树,图等)随申请随存储,即有一个新的数据则申请新的空间存储------不需要初始化时给出足够大空间。而数组初始化时需要给出足够大空间

2.变量的作用域以及出入栈

变量声明的位置决定了变量的作用域和生存期。
例:
在这里插入图片描述
顺序:
a入栈 -> b入栈 -> i入栈 -> s,h入栈后出栈循环6次 -> i出栈 -> b出栈 ->a出栈

注:s,h是在For循环中定义的,每次遇到 } 时出栈,所以最终执行完6次循环的时候,S,h是不在栈中的。如果这时在For循环外使用s,h,会产生编译错误。

3.方法的调用和出入栈

调用方法时,方法入栈。
方法执行结束后,出栈。

方法的调用和执行顺序遵循栈“先进后出”的原则。

例:

public int method1()
{
      method3();
}
public void method2()
{
      method1();
      method4();
}
public void method3()
{
}
public void method4()
{
}
int main()
{
        int j = method1();
        method2();
        return 0;
}

顺序:
main入栈 -> method1入栈 -> method3入栈 -> method3执行出栈 -> method1执行出栈 -> method2入栈 ->method1入栈 -> method3入栈 -> method3执行出栈 -> method1执行出栈 -> method4入栈 -> method4执行出栈 -> method2执行出栈 -> main出栈。

大概像下面这个图这个亚子~~

请不要嫌弃我做的图丑,大家互夸不好么???
在以上方法调用时,有入栈有出栈。
但在递归方法中,入栈直到最后一次递归结束后才开始逐个出栈,因此递归方法占用内存太大。

4.变量的存储

栈(与顺序有关) 堆(与顺序无关)
1. 定义在方法中的变量名 (包括基本类型数据和引用类型数据) 2.定义在方法中的基本类型的变量值 定义在结构体 / 类(对象)中的变量;定义在方法中的除基本类型外的类型的变量值

1> 定义在方法中的(与顺序有关):

所有变量名全都存放在
基本类型变量值也存放在
其他类型的变量值存放在

2> 定义在结构体,类(对象)中的:

因为定义在结构体,类中的变量随着对象的创建而整体赋值,随着对象的析构整体销毁,没有顺序,存在中。

5. “=”的含义

“=”表示拷贝,赋值。
对于基本类型,表示将右边变量的值赋给左边变量。
对于引用类型,区分引用传递和值传递。

例:

Object a = new ....
Object b = a;  //这里表示b拿到a的地址,b指向a指向的内存单元
↑↑↑
此处为 引用传递

Object c = new ....
b = c;     //此处的赋值**只改b的值而不改a的值**

(相当于只能改指针的值,不能通过指针去改指针所指向变量的值)

↑↑↑ 
此处为 值传递

//若a,b均有k数据成员
a.k = 90;
b.k = 80;
//因为a和b指向同一块内存,即他们所指向的k为同一个
//因此改变会互相干扰

(初次写博客,还望大家海涵,有任何错误,请联系我删除,蟹蟹)

发布了2 篇原创文章 · 获赞 1 · 访问量 38

猜你喜欢

转载自blog.csdn.net/fu_GAGA/article/details/103393955
今日推荐