变量类型(接C变量作用域,生存期,链接特性)

自动变量

自动存储类型,特点:自动存储期,块作用域,无链接。默认情况下,在块级作用域中或函数头中的变量属于自动存储类型的变量。当然,也可以受用关键字"auto"特别声明,一般用处不大。

示例:

// hiding.c -- variables in blocks
#include<stdio.h>
int main()
{
    int x = 30;       // original x

    printf("x in outer block: %d at %p\n", x, &x);
    {
        int x = 77;   // new x, hides first x
        printf("x in inner block: %d at %p\n", x, &x);
    }
    printf("x in outer block: %d at %p\n", x, &x);
    while (x++ < 33)  // original x
    {
        int x = 100;  // new x, hides first x
        x++;
        printf("x in while loop: %d at %p\n", x, &x);
    }
    printf("x in outer block: %d at %p\n", x, &x);

    return 0;
}

输出:

x in outer block: 30 at 0x7ffee9725ae8

x in inner block: 77 at 0x7ffee9725ae4

x in outer block: 30 at 0x7ffee9725ae8

x in while loop: 101 at 0x7ffee9725ae0

x in while loop: 101 at 0x7ffee9725ae0

x in while loop: 101 at 0x7ffee9725ae0

x in outer block: 34 at 0x7ffee9725ae8

没有{}的块级作用域

loop或if内的代码一般也会产生一个块,其中定义的变量的生存期只在loop内或条件判断内。

示例:

// forc99.c -- new C99 block rules
#include<stdio.h>
int main()
{
    int n = 8;

    printf("   Initially, n = %d at %p\n", n, &n);
    for (int n = 1; n < 3; n++)
        printf("      loop 1: n = %d at %p\n", n, &n);
    printf("After loop 1, n = %d at %p\n", n, &n);
    for (int n = 1; n < 3; n++)
    {
        printf(" loop 2 index n = %d at %p\n", n, &n);
        int n = 6;
        printf("      loop 2: n = %d at %p\n", n, &n);
        n++;
    }
    printf("After loop 2, n = %d at %p\n", n, &n);

    return 0;
}

输出:

Initially, n = 8 at 0x7ffeef08dae8

loop 1: n = 1 at 0x7ffeef08dae4

loop 1: n = 2 at 0x7ffeef08dae4

After loop 1, n = 8 at 0x7ffeef08dae8

loop 2 index n = 1 at 0x7ffeef08dae0

loop 2: n = 6 at 0x7ffeef08dadc

loop 2 index n = 2 at 0x7ffeef08dae0

loop 2: n = 6 at 0x7ffeef08dadc

After loop 2, n = 8 at 0x7ffeef08dae8

寄存器变量

在块级作用域内使用关键字"register",和自动变量的唯一区别是该变量保存在CPU寄存器中,而不是内存中,意味着不能进行取地址操作(指针等)。寄存器变量存储在CPU寄存器中,可以比常规变量更快地访问和操作。不过编译器会权衡可用寄存器的数量和你的显式寄存器变量声明,因此有可能会忽略该声明,从而该变量实际上会变为自动变量,但仍然不能使用地址操作符进行操作。

块级作用域中的静态变量

特点:作用域为块级,存储期为静态存储期,无链接。

示例:

// loc_stat.c using a local static variable
#include<stdio.h>
void trystat(void);

int main(void)
{
    int count;

    for (count = 1; count <= 3; count++)
    {
        printf("Here comes iteration %d:\n", count);
        trystat();
    }

    return 0;
}

void trystat(void)
{
    int fade = 1;
    static int stay = 1;

    printf("fade = %d and stay = %d\n", fade++, stay++);
}

输出:

Here comes iteration 1:

fade = 1 and stay = 1

Here comes iteration 2:

fade = 1 and stay = 2

Here comes iteration 3:

fade = 1 and stay = 3

说明:虽然静态变量stay在trystat函数中声明,但该变量只会声明一次,这是因为静态变量和外部变量在程序加载到内存前已经存在。将静态变量的声明放在函数内只是为了告诉编译器该变量仅在该函数内可见。

原文地址:https://www.cnblogs.com/jeffrey-yang/p/10261564.html

时间: 2024-11-09 16:33:23

变量类型(接C变量作用域,生存期,链接特性)的相关文章

python有哪些变量类型?以及变量类型的总结

python有哪些变量类型?以及变量类型的总结[数值]Number:float.int.long.complex [字符串]:str注意没有string,这里的str就是string的缩写. 创建方式:str() a='abcdef' 方法: 1.截取:a[头下标:尾下标:每步值] 每步值默认是:1 2.增加:a + a 等同 a*2 3.合并:a + a 4.S.lower() #小写 5.S.upper() #大写 6.S.swapcase() #大小写互换 7.S.capitalize()

zendstudio 声明变量类型,让变量自动方法提示

zendstudio 行内注释, 显式声明变量类型,让变量自动方法提示 $out = []; /* @var $row \xxyy\SizeEntity */ foreach ($rows[ 'list'] as $row) { $out[ 'list'][] = [ 'width' => $row->getWidth(), 'height' => $row->getHeight(), ]; } $out = []; /* @var $invoice ChargeInvoice *

Java变量类型,实例变量 与局部变量 静态变量

实例变量: 实例变量在类中声明,但在方法的外面,构造函数或任何块. 当空间分配给某个对象在堆中,插槽为每个实例变量创建值. 当一个对象与使用关键字 “new” 来创建,在对象被销毁销毁创建的实例变量. 实例变量认为必须由一个以上的方法,构造函数或块,或一个对象的状态的关键部分必须出现在整个类中引用的值. 实例变量可以在使用前或后级的级别声明. 访问修饰符可以给出实例变量. 实例变量对于所有方法,构造函数和块在类中可见.通常,建议,使这些变量私有(接入层).然而能见度子类可以给这些变量与使用访问修

PHP学习笔记-变量-动态变量,变量类型检测以及变量销毁

1.动态变量:变量名还可以是一个变量 例: 先给 变量a 一个'帅哥'的值,再给 变量帅哥 另一个值为'zhang',此时echo $a 和echo $帅哥显示的都为在php中赋的值.然后echo $$a 首先找到$a的值为'帅哥',帅哥充当了下一个变量的值,那么$$a = $ 帅哥=zhang: 变量戏法: 拓展:      2.变量检测 3.变量的销毁 为什么要把变量销毁? 因为内存空间是有限的,销毁变量可以腾出空间. 原文地址:https://www.cnblogs.com/bard233

javascript数据变量类型判断(JS变量是否是数组,是否是函数的判断)

function isArray(o) { return Object.prototype.toString.apply(o) === “[object Array]”;}function isFunction(o) { return Object.prototype.toString.apply(o) === ”[object Function]“;} --JQuery  源码有....

bash变量类型

bash变量类型:本地变量:varname=value,作用域为整个shell进程局部变量:local varname=value,作用域为当前代码段环境变量:export varnmae=value,作用域为当前shell进程及其子进程位置变量:$1, $2, $3 -.特殊变量:$?,上一个命令执行状态返回值

bash脚本编程之一 变量、变量类型等

shell编程: shell:弱类型编程语言 强:变量在使用前,必须事先声明,甚至还需要初始 弱:变量用时声明,甚至不区分类型 bash变量类型: 环境变量 本地变量 位置变量 特殊变量 本地变量: VARNAME=VALUE:作用域为整个bash进程: 局部变量: local VARNAME=VALUE:作用域为当前代码段: 环境变量:作用域为当前shell进程及其子进程 export VARNAME=VALUE 位置变量: $1,$2,.... 特殊变量: $?:上一个命令的执行状态返回值:

bash脚本编程之(1/4) 变量、变量类型等笔记

Shell编程: 编译器,解释器 编程语言: 机器语言.汇编语言.高级语言 静态语言: 编译型语言 强类型(变量) 事先转换成可执行格式 c\c++\JAVA\c# 动态语言: 解释性语言 弱类型 边解释边执行 asp/asp.net/php/shell/python/perl Shell: 弱类型编程语言 强类型: 变量在使用前,必须事先声明,甚至还需要初始: 弱类型: 变量用时声明,甚至不区分类型: 面向过程: Shell C 面向对象: JAVA Python, perl, c++ 变量:

shell之基础概念与变量类型

静态语言:编译型语言 事先转换成可执行格式 强类型(变量) 关键字: C C++ JAVA C# 动态语言:解释型语言 on the fly 弱类型 边解释边执行 Asp.net shell PHP Python perl 面向过程 面向对象 变量:内存空间,命名 变量类型:事先确定数据的存储格式和长度 字符 数值 整型 浮点型:11,23 整型:8bit 256 0-255 溢出-->缓冲区溢出 逻辑: 布尔类型:0,1 逻辑运算:与,或,非,异或 1:真 0:假 1&0=0 0&

Shell和bash变量类型

Shell 是面向过程的 (bash为例) 变量是进程的变量,进程结束,变量消失. bash变量类型:     环境变量     本地变量(局部变量):     位置变量     特殊变量 本地变量: set  VARNAME=VALUE      作用域为整个bash进程 局部变量:      local VARNAME=VALUE 作用域为当前代码段 环境变量:作用域为当前shell进程及其子进程 export VARNAME=VALUE or: VARNAME=VALUE export V