关于主函数
- main()函数的为什么总有个
return 0;
?- 因为定义main()函数时用了 int main(),所以编译系统要求main()返回一个整型数值,但因为main()的主要作用不是返回数值,而且main()函数只能由操作系统调用,所以它的返回值的具体意义不大,如果定义了main()函数的返回值类型,则返回一个符合定义的任意数值即可,或者将其定义为void型,则不需要返回值
- 为什么有的函数要定义类型(就是返回值的类型)?
- 与函数具体完成的功能有关,如果函数的作用是计算一个数值,则常用方式是该数值通过返回值来体现,此时需要定义函数的返回值类型,也就是函数的类型,相应的要有return语句
变量存储类型
自动的:auto
- 不专门声明为static存储类别的局部变量都是动态分配存储空间。
- 在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。因此这类局部变量称为自动变量。
静态的:static
- 当函数中的局部变量的值想要在函数调用结束后不消失而保留原值时,该变量称为静态局部变量。用关键字static进行声明。
#include <iostream>
using namespace std;
int f(int a)
{
auto int b = 0; // auto类型
static c = 3; // 静态类型
b = b + 1;
c = c + 1;
return(a + b +c);
}
void main()
{
int a = 2, i;
for(i =0; i <3; i++)
cout << f(a) << '\t';//7 8 9
cout << endl;
}
注意点
- 静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区空间而不占静态存储区空间,函数调用结束后即释放。
- 对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。
- 如在定义局部变量时不赋初值的话,但对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。而对自动变量来说,如果不赋初值则它的值是一个不确定的值。
- 虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用它。
寄存器的:register
- 一般情况下变量的值是存放在内存中的。当程序中用到哪一个变量的值时,由控制器发出指令将内存中该变量的值送到运算器中。 经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。
- 如果有一些变量使用频繁,则存取这些变量的值要花费不少时间。为提高执行效率,C语言允许将局部变量的值放在CPU中的寄存器中,需要使用时可以直接从寄存器取出参加运算,不必再到内存中去存取。
- 由于对寄存器的存取速度远高于对内存的存取速度,因此这样做可以提高执行效率。这种变量叫做寄存器变量,用关键字register作声明。
register类型的变量不能对它用&进行取值操作!
外部的:extern
- 外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。编译时将外部变量分配在静态存储区。用extern来声明外部变量,以扩展外部变量的作用城。
用extern仅是进行变量声明,而不是变量定义!
#include <iostream>
using namespace std;
int A; /*定义外部变量*/
void main(){
extern int power(int); /*函数声明, 该函数在另外文件ex2.cpp中*/
int b = 3, c, d, m;
cout << ("enter the number a and its power m: ");
cin >> A >> m;
c = A * b;
cout << A << '*' << b << '=' << c << endl;
d = power(m);
cout << A << "**" << m << '=' << d << endl;}
extern A; /*声明A为一个已定义的外部变量*/
int power(int n)
{ int i,y=1;
for(i=1;i<=n;i++)
y*=A;
return(y);
}
指针变量的引用
&* pointer_1
的含义是什么?
“&”和“*”
两个运算符的优先级别相同,但按自右而左方向结合。因此,&* pointer_1
与&a相同,即变量a的地址。
如果有pointer_2 =&* pointer_1 ;
它的作用是将&a(a的地址)赋给pointer_2 ,如果pointer_2原来指向b,经过重新赋值后它已不再指向b了,而指向了a。*&a
的含义是什么?
先进行&a运算,得a的地址,再进行*
运算。*&a
和*pointer_1
的作用是一样的,它们都等价于变量a。即*&a与a等价。