常量记忆数据只能存储一个固定的数据,永远不变,所以这当然不能算得上是记忆数据
变量存储的数据可以改变,你可以让它记忆5,下一步它可以变为10
那么请不用尝试变量编程实现以下:
输入一个100之内的整数,输出它。
最后你会发现不使用变量无法实现
因为你每次需要输入的数需要存储下来,而常量只能在程序开始才能"赋值"(指定值),自然就不能存储这个数据了,而变量就是用来存储数据的。
我的理解:常量是橡皮檫,虽然有各种形状,但在你买时就已经决定形状不可更改了,就好像你在一个程序中可以设置常量,常量的值可以设为1,2,10或者是实型的15,26也可以是'a'但一经设置便不可更改。而变量则像是橡皮泥,你可以轻易地改变他的形状,但你不能轻易地改变它的类型,就如程序中你可以任意的改成它的值,从100到-100,从2到11111都行。
望帮到你!
注意:在大括号中申请的静态变量i与循环变量i并不是同一个变量,编译程序自动将它们解释成两个变量来使用,我们这里不妨将循环变量起个别名为ii:
ii=0; ii=Square(i);[ii=Square(0)=00=0]ii=0;i<3成立,开始循环: i=2;i+=Square(i);[i=2+22=6],printf输出[6换行]
ii++;[ii=1],ii<3成立,继续循环: i+=Square(i);[i=6+66=42],printf输出[42换行]
ii++;[ii=2],ii<3成立,继续循环: i+=Square(i);[i=42+4242=1806],printf输出[1806换行]
ii++;[ii=3],ii<3不成立,结束循环
printf输出[3换行]
运行结果
变量的概念
变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念。变量可以通过变量名访问。在指令式语言中,变量通常是可变的;但在纯函数式语言(如Haskell)中,变量可能是不可变(immutable)的。在一些语言中,变量可能被明确为是能表示可变状态、具有存储空间的抽象(如在Java和Visual Basic中);但另外一些语言可能使用其它概念(如C的对象)来指称这种抽象,而不严格地定义"变量"的准确外延。
变量的范围确定了能够知晓该变量存在的那部分代码。在一个过程内部声明变量时,只有过程内部的代码才能访问或改变那个变量的值;它有一个范围,对该过程来说是局部的。但是,有时需要使用具有更大范围的变量,例如这样一个变量,其值对于同一模块内的所有过程都有效,甚至对于整个应用程序的所有过程都有效。Visual Basic 允许在声明变量时指定它的范围。
存储类型
我们在程序中会经常定义一些变量来保存和处理数据。从本质上看,变量代表了一段可 *** 作的内存,也可以认为变量是内存的符号化表示。当程序中需要使用内存时,可以定义某种类型的变量。此时编译器根据变量的数据类型分配一定大小的内存空间。程序就可以通过变量名来访问对应的内存了。
如果说变量的数据类型决定了对应内存的大小,那么存储类型则影响着对应内存的使用方式。所谓使用方式,具体说就是在什么时间、程序的什么地方可以使用变量,即变量的生命周期和作用域。
先了解一些基本常识。一、在程序运行时内存中有三个区域可以保存变量:静态存储区、栈(stack)和堆(heap)。二、根据变量定义的位置可分为全局变量(定义在函数体外的变量)和局部变量(定义在函数体内的变量,包括形参)。
所有的全局变量和静态局部变量(定义时使用关键字static)都保存在静态存储区,其特点是:在编译时分配内存空间并进行初始化。在程序运行期间,变量一直存在,直到程序结束,变量对应的内存空间才被释放。
而所有的非静态局部变量(又称为自动变量)保存在栈(stack)中,其特点是:在变量所在的函数或模块被执行时动态创建,函数或模块执行完时,变量对应的内存空间被释放。换句话说,函数或模块每被执行一次,局部变量就会重新被分配空间。如果变量定义时没有初始化,那么变量中的值是随机数。
所有用malloc分配的内存(又称为动态内存)都在堆(heap)中,其特点是:一般通过指针来访问动态分配的内存。即可以通过free来手动释放动态内存,也可以在程序结束时由系统自动释放。
以上讨论的是变量的生命周期,下面来看作用域。作用域指的是变量的可见范围,即在变量的生命周期内,程序的哪些部分可以使用该变量。
全局变量的作用域从定义点开始一直到源文件的结束。如果要在定义点之前使用全局变量的话就需要使用关键字extern对作用域进行扩展。全局变量缺省是可以被其他文件引用的。如果希望仅限于本文件使用的话,需要在定义时使用关键字static。
对于局部变量来说,无论是静态局部变量还是自动变量,作用域都仅限于定义该变量的函数或模块。
动态内存只要没有被释放就可以在程序的任何地方使用,前提是要知道动态内存的地址。
注:static加在全局变量前影响的是作用域,加在局部变量前影响的是生命周期。
自变量是在本程序中单独使用的 主程序和子程序互不影晌 打个比方说如#1 主程序 #1=4 子程序的#1=10 回到主程序 #1仍然是4 公共变量就会被重新赋值
#1-#33为自变量
#100-#199 公共变量 断电复位清零
#500-#599 公共变量 断电复位不清零
好问题
这样理解:
(1) 对于现代的 *** 作系统来讲, 每个进程都有自己的独立虚拟地址空间, 进程中的地址并不是实际的物理内存的地址, 内核会完成从虚拟地址到物理地址的映射 所以两个不同进程中的同一虚拟地址, 不一定(这块我只能用不一定)映射到同一物理内存地址
(2) 对于父子进程而言, 子进程是父进程调用fork()后创建出来的拷贝, 理论上二者在虚拟内存空间这个角度上看是一样的, 所以在父进程在fork()前创建的变量, 与fork()后子进程中的同一变量虚拟地址是一样的
(3) 对于内核而言, 每次fork()时都创建父进程的完整拷贝, 效率是比较低下的, 所以 *** 作系统会使用copy-on-write(写时拷贝)机制, 所以在父子进程中一方对某一地址空间写入之前, 二者实际上是映射到同一物理内存地址, 父子一方对某一地址空间进行写入 *** 作时, *** 作系统才实际创建这一部分的拷贝
C语言源程序是由:数据类型、常量与变量、数组、指针、字符串、文件输入/输出构成。
具体介绍:
1、数据类型
C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。
2、常量与变量
常量其值不可改变,符号常量名通常用大写。变量是以某标识符为名字,其值可以改变的量。标识符是以字母或下划线开头的一串由字母、数字或下划线构成的序列,请注意第一个字符必须为字母或下划线,否则为不合法的变量名。变量在编译时为其分配相应存储单元。
3、数组
如果一个变量名后面跟着一个有数字的中括号,这个声明就是数组声明。字符串也是一种数组。它们以ASCII的NULL作为数组的结束。要特别注意的是,方括内的索引值是从0算起的。
4、指针
指针不仅可以是变量的地址,还可以是数组、数组元素、函数的地址。通过指针作为形式参数可以在函数的调用过程得到一个以上的返回值,不同于return(z)这样的仅能得到一个返回值。
指针是一把双刃剑,许多 *** 作可以通过指针自然的表达,但是不正确的或者过分的使用指针又会给程序带来大量潜在的错误。
5、字符串
C语言的字符串其实就是以'\0'字符结尾的char型数组,使用字符型并不需要引用库,但是使用字符串就需要C标准库里面的一些用于对字符串进行 *** 作的函数。它们不同于字符数组。
6、文件输入/输出
在C语言中,输入和输出是经由标准库中的一组函数来实现的。在ANSI C中,这些函数被定义在头文件<stdioh>;中。
扩展资料:
语言特点
1、高级语言:它是把高级语言的基本结构和语句与低级语言的实用性结合起来的工作单元。
2、结构式语言:结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。
3、代码级别的跨平台:由于标准的存在,使得几乎同样的C代码可用于多种 *** 作系统,如Windows、DOS、UNIX等等;也适用于多种机型。C语言对编写需要进行硬件 *** 作的场合,优于其它高级语言。
4、使用指针:可以直接进行靠近硬件的 *** 作,但是C的指针 *** 作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针 *** 作的同时又增强了安全性,受到了一些用户的支持。
文本型顾名思义就是所有的文本,需要“”圈起来
整数型顾名思义就是所有的整数,比如1 、0、-1、
小数型顾名思义就是小数,比如10、-20
逻辑性:不是真就是假,默认为假。
以上就是关于程序中什么是变量啊全部的内容,包括:程序中什么是变量啊、for语句是怎麽执行的,尤其是里面的静态变量、变量的概念等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)