简单数组(static + 数组)

本文介绍了`static`关键字在修饰变量和函数时的作用,详细解析了数组的定义、使用方式,包括直接定义、动态赋值,以及数组在内存中的表示。强调了数组名的含义,它不仅是数组首元素的地址,也是数据结构的代表。

简单数组(static + 数组)

=====================================

一、static

1.static修饰变量

a. 函数中局部变量:

  声明周期延长:该变量不随函数结束而结束
  初始化:只在第一次调用该函数时进行初始化
  记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值
  存储位置:不会存储在栈上,放在数据段
//其中,c因为每次循环始终为1,而b因为static的缘故,只在一开始初始化一次,将后续的值继续代入.
#include <stdio.h>
int sum(int a)
{
    int c = 0;
    static int b = 3;
    c += 1;
    b += 2;
    return (a + b + c);
}
int main()
{
    int i;
    int a = 2;
    for (i = 0; i < 5; i++) 
    { 
        printf("%d,", sum(a)); 
    } 
} 

b. 全局变量

让该变量只能在当前文件中使用

c. 修饰变量时,没有被初始化时会被自动初始化为0

2. static修饰函数

让该函数只能在当前文件中使用

二、数组

1.数组的定义 :int arr[],[]中只能加数字

①直接定义

int array[]={1,2,3}

②定义后再给数组各元素赋值;

int array[3];
for(int i=0;i<3;i++)
array[i]=i;

2.数组的使用:

(1)在调用数组时,可以给arr[]的[]中加变量
(2)一般情况下,arr指的是arr[]数组中的首元素地址
但如果遇到
strlen(arr) 这里arr指的是整个数组
sizeof(arr)
&(arr)

3.数组名的含义

  • 数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;指向数组的指针则是另外一种变量类型,仅仅意味着数组的存放地址!

=====================================

### Static 数组的用法与定义 #### C/C++ 在 C 和 C++ 中,`static` 关键字可以应用于数组以修改其存储持续时间(storage duration)。当 `static` 被用于局部数组时,该数组将在整个程序执行期间保持存在,并且只会在第一次进入作用域时初始化一次。 以下是具体说明: - **全局静态数组** 如果在一个文件的作用域外定义一个带有 `static` 的数组,则这个数组具有内部链接性。这意味着即使其他源文件中有同名的数组也不会发生冲突[^1]。 - **局部静态数组** 当 `static` 应用于函数内的局部数组时,此数组在整个程序生命周期中都存在,而不是像普通局部变量那样仅存在于函数调用期间。每次重新进入函数时,不会再次初始化数组[^1]。 示例代码如下: ```c #include <stdio.h> void func() { static int arr[3] = {0}; // 静态局部数组,在首次调用func时初始化为{0} arr[0]++; printf("%d ", arr[0]); } int main() { func(); // 输出 1 func(); // 输出 2 return 0; } ``` 在此例子中,由于 `arr` 是静态的,所以它的值会跨多次函数调用保留下来。 另外需要注意的是,在标准C语言里不允许直接通过`new`来动态分配带`static`属性的空间;而在C++环境下虽然支持某些形式上的扩展语法实现类似效果,但严格意义上讲这并非传统意义上的`static`概念[^4]。 #### Java 相比之下,Java 并不允许可变大小或者手动管理内存的行为模式(比如利用指针操作),因此也就不存在所谓“真正的”静态数组的概念——即那些可以在运行期调整尺寸并由开发者自行决定何时释放资源的数据结构。不过我们仍然可以通过声明类成员级别的字段作为模拟手段之一达到近似目的: 如果把某个一维或多维数值容器设成属于某特定类别而非实例个体所有的话那么就可以认为这是所谓的‘静态’版本了因为它们共享同一个副本给所有的实体对象使用而不需要单独复制每一份独立拷贝出来供各自独享[^1]. 下面是一个简单的演示案例: ```java public class Example { private static int[] array; public static void initializeArray(){ if(array == null){ array=new int[]{1,2,3}; } } public static void printElements(){ for(int element : array){ System.out.print(element+" "); } } public static void main(String[]args){ initializeArray(); printElements();//prints:"1 2 3 " } } ``` 这里展示的就是如何创建以及访问这样的静态数组成员的方法论[^2]. 尽管如此还是应该注意到一点区别就是说即便是在同一进程当中不同的线程之间也可能看到不一样的视图除非采取额外同步措施加以保护防止竞争条件等问题的发生. --- ### 总结 综上所述,C/C++允许更灵活地运用`static`修饰符去定制不同类型行为表现出来的数组特性;而对于Java而言则更多依赖于面向对象的设计理念借助封装机制达成相应功能需求满足实际应用场景下的开发工作要求.[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值