C 语言 static、extern与指针函数介绍

1.exit(0)正常退出程序

   exit(1)程序异常时退出程序

2.static(静态变量)修饰局部变量

  在局部变量使用static修饰,会延长局部变量的存在期。但我们需要注意一下几点:

  • 虽然static修饰变量的生存期很长,但它始终是局部变量,不能在其他函数中使用
  • static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?       全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式,  静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,  当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,  在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,  因此可以避免在其它源文件中引起错误。      从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。      static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件      static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;      static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;      static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

3.extern(外部变量)  修饰全局变量

       extern 不但可以修饰变量还可以修饰函数

全局变量范围已经很广了,为什么还要用extern来修饰呢?看下面一个例子

#include "stdio.h"
void main()
{
      extern        a;
      extern        b;
      printf("a=%d,b=%d",a,b);  
}
int a=13,b=5;

上面例子中,在定义了a,b之前就使用它,也就是说extern扩展了全局变量的作用范围。

extern不仅上边例子这种用法,在不同文件中的全局变量也可以使用extern来使用。

4.指针函数

       定义:指针函数就是函数类型和返回值都是指针的函数。

指针函数的一般形式:

              类型 *函数名(参数列表)

下面用一个例子来体会一下指针函数的妙用吧

/* Note:Your choice is C IDE */
#include "stdio.h"
char * SubString(char s[],int i,int j);
char *SubString1(char s[] ,char temp[], int i,int j);
void main()
{ 
char string[]="I Love C Language"; 
char *ps=NULL;
char temp[100];
ps=SubString(string,2,9); 
printf("%s\n",ps);  
SubString1(string,temp,2,9);
printf("%s\n",temp);
}
char * SubString(char s[],int i,int j)
{
   static char temp[100];/*这个地方声明的临时数组必须为static,否则值传不会去*/
int m,n;
for(m=0,n=i;n<=j;m++,n++)
{
temp[m]=s[n];
}
temp[m]='\0';
return temp;
}
char *SubString1(char s[] ,char temp[], int i,int j)
{
int m,n;
for(m=0,n=i;n<=j;m++,n++)
{
temp[m]=s[n];
}
temp[m]='\0';
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云霄雨霁

发布与逸出

1273
来自专栏java学习

Java基础总结大全(1)

一、基础知识: 1、JVM、JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。 ...

3695
来自专栏nummy

itertools模块详解

tee()创建的迭代器共享其输入迭代器,所以一旦创建了新迭代器,就不应该再使用远迭代器。

1433
来自专栏WD学习记录

html5学习笔记(二)

1. min、max、step属性用于包含数字或日期的input类型规定限定(约束)。

761
来自专栏从流域到海域

《笨办法学Python》 第11课手记

《笨办法学Python》 第11课手记 本节课讲了一个用来输入的函数raw_input,而我们一直用的print其实是一个用来输出的函数。 原代码如下: pri...

2279
来自专栏Deep learning进阶路

C++随记(八)---存储持续性、作用域和链接性

版权声明:本篇文章是阅读《C++primer plus (第6版)中文版》第9章之后所作的笔记。部分文字和图表摘自于这本书。 C++随记(八)---存储持续性、...

1960
来自专栏java思维导图

【一分钟知识】异常处理,值传递和引用传递

异常处理 关键字:throws、throw、try、catch、finally try用来指定一块预防所有异常的程序; catch子句紧跟在try块后面,用来指...

3448
来自专栏康怀帅的专栏

Bash 函数详解

默认情况下,脚本中定义的任何变量均为 全局变量,可以在函数内访问。 创建函数 # function关键字创建函数 function func1 { e...

3154
来自专栏Linyb极客之路

并发编程之Synchronized关键字

一、Synchronized的基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作...

2976
来自专栏java学习

Java基础总结大全(1)

一、基础知识: 1、JVM、JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。 ...

42311

扫码关注云+社区

领取腾讯云代金券