`
ericliu1986
  • 浏览: 111039 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

C语言基础知识要点汇总

    博客分类:
  • C
阅读更多

     最近所在的项目组正在做C的开发,前两天刚coding完一个4千来行的程序,4千行的C程序对于经常做C开发的人来说可能不算什么,但这是我开发过的最长的一个C程序,做完之后还是小有一点成就感的。大一的时候学了些基础,之后就没深入的学习也不怎么用过C,借着这次机会想把C复习一下,所以整理了一下可能平时淡忘了的、模糊的知识点。以下内容不是系统的知识梳理而是一些零碎的知识点。如有说得不对的地方,望大伙能及时指正,以达到共同进步的目的。

1、变量名与变量值

    变量名实际上是一个符号地址。程序编译时,系统给变量开辟该变量对应类型所需的内存空间(用于存储变量值),然后由系统建立一个从变量名到该内存空间的首地址的映射,这样就可以通过变量名访问到变量值了。
  
    变量名由数字、字母和下划线组成。大小写敏感,不能以数字开头。变量名的长度(字符个数)没有硬性的规定,只是不同的C编译器可能会有不同要求。

    C语言中,使用变量之前必须定义该变量,否则编译出错。定义变量时须写明变量所属类型。程序编译时,会根据变量的类型来决定为该变量开辟多大的内存空间,同时还可以检查运算的合法性。比如实型数据之间不能做求余数的操作。

2、整型数据

    C语言中,整型数据的类别有三种:short,int,long;属性有两种:signed,unsigned。共有六种组合。
   
    整型数据类型的长度:C标准没有硬性规定每种类型的长度,只是规定:long的长度要不小于int;short的长度不大于int。一般的C编译器都会以一个机器字的存放一个int型数据。

3、变量初始化

    变量的初始化不是在编译期间完成内存空间的分配(只有静态变量和外部变量是在编译期间初始化),而是在程序运行时执行函数时才赋值。

 

4、格式输入&输出

    %md,%mc,%ms(m为正整数):m的大小决定了输出内容的宽度,当输出内容的长度小于m时,输出内容右对齐,左补空格;当输出内容的长度大于m时,输出内容不受m的限制,原样输出。
   
    %-md,%-mc,%-ms:用法同上,只是输出内容左对齐,右补空格。
    %m.nf,%m.ns :m控制输出内容的总宽度,对于实型数据来说小数点也算一位,当输出内容的实际宽度大于m时突破m的限制;%m.nf中的n控制小数位的位数,%m.ns中的n表示截取字符串的左n位,若n小于m则左补空格。

    %0md:输出m位的整型数值,如果被输出的数据位数小于m时,前补0

 

5、C语言的变量的存储类型

 

      C语言的变量存储类型有很多种分法,根据生命周期来分可分为:动态变量和静态变量;根据使用域来分可分为:局部变量和全局变量(又叫内部变量和外部变量)

 

      a)、动态变量和静态变量。

 

      动态变量------变量所占空间是动态分配的,即只有到使用到某个变量时,才动态的给该变量分配内存空间,用完后还要及时收回。比如函数的形参及函数内的局部变量。其代码表现形式为关键字"auto" +变量类型名+变量名,一般情况下关键字"auto"省略不写。也就是说我们平时用得最多的就是动态变量。动态变量存放于内存的栈区和堆区。

 

      静态变量------变量所占空间是静态的,即程序自始至终一直存在。代码表现形式为关键字"static"+变量类型名+变量名,静态变量的初始化是在编译期完成的,且只初始化一次,程序执行时不再对静态变量进行赋初值。

 

      b)、局部变量和全局变量(又叫内部变量和外部变量)

 

      局部变量------定义在函数体内部的变量,所以又叫内部变量。其作用域仅限于声明该局部变量的函数体内部。程序运行时,在动态存储区为局部变量分配空间(静态局部变量除外)。

 

      一般情况下使用的局部变量都是动态变量,但并不表示没有静态的局部变量。静态局部变量因为是静态的所以会被存在静态存储区,这就意味着即使函数调用结束,它的值还仍然存在。利用这一特性我们可以用静态局部变量来保留函数上一次的执行结果

 

      全局变量------定义在函数体外部的变量,所以又叫外部变量。其作用域为该全局变量的声明处一直到程序结束。与局部变量不同的是,全局变量存在静态存储区,在编译期就被分配空间。

 

      外部变量可以用"extern"关键字来扩展作用域。例如:一int型的外部变量A被定义在程序的中部,那该外部变量的作用域是不包含其以上的函数的,如果在文件开头使用"extern A"来声明该外部变量,那该外部变量的作用域变会被扩大到整个文件。使用"extern"还可以把外部变量的作用域扩大到另外的文件中。例如:在a.c中有一外部变量A,那在b.c中使用extern A声明后A在b.c中也可以使用了。

 

 

0, 逗号表达式:

    int a=(b=1,c=2,d=3);printf("%d",a) //a=3

    整个逗号表达式的值等于最后一个子表达式的值。

 

1、 条件表达式:exp1?exp2:exp3

   a、条件表达式的优先级高于赋值运算

   b、条件表达式的结合方向是自右向左(先计算右边的表达式)

   c、exp2和exp3不仅可以是数值表达式,还可以是赋值或函数表达式。如a>b?(a=100):(b=200);或a>b?(printf("%d",a)):(printf("%d",b));

   d、exp1,exp2,exp3的类型可以不一样。如x?'a':'b';x>y?1:1.5

 

2、闰年的条件:

   if((year%400==0)||(year%4==0&&year%100!=0))leap = 1;else leap=0;

 

3、多维数组:

   a、二维数组的存放顺序:按行存放。

   b、多维数组在内存中的排列顺序:最右边的下标变化最快。

 

4、C语言变量类型

   a、按存储形态分

      i  静态变量(全局变量和static修饰的变量,存于内存的静态存储区,在编译区被初始化,程序的执行期间一直有值)

      ii 动态变量(声明在"{}"之间的变量和形参,存于内存的动态存储区的栈空间,动态分配空间,函数调用结束内存回收)

   b、按作用域分

      i  内部变量(作用域仅限于"{}"内)

      ii 外部变量(作用域:从声明处到文件结束,在其它文件中使用extern声明外部变量还可以把作用域扩展到该文件中)

   a+b、

      i  静态内部变量(内部变量的作用域没变,只是程序执行期间一直有值)

      ii 静态外部变量(该外部变量只属于本文件,无法使用extern扩展作用域)

 

5、函数类型

   a、内部函数(使用static修饰,只能被本文件中的其它函数调用)

   b、外部函数(使用extern修饰或不用修饰,可以被其它文件中的函数调用)

 

关于指针和指针变量
指针
指针及内存地址。对于32位机来说,内存地址需要32bit也就是4Byte的二进制数来表示,所以指针是一个4Byte的二进制数。
指针变量
用于存储指针的变量,也就是说指针变量的内容是一个内存地址是一个4Byte的二进制数。无论指针变量指向的是什么类型的数据,它的值永远只会是一个4Byte的二进制内存地址。
存储的内容都是长度一样的内存地址,那为什么声明的时候还要写明该指针变量的类型呢?我们知道不同类型的数据在内存中占用的字节数是不一样的,所以通过指针访问数据时
指针变量移动的步长也是不一样的。例如:一个指针变量p指向了某整型数组的第一个元素a[0],此时我想用这个指针变量p来访问a[1]时只需要将p+1也就是*(p+1)就能取得a[1]的
值。我们在编码的时候让p+1而实际上内存地址移动了4个字节(一个整型数据所占的内存空间),也就是说p+i代表内存地址要移动p+i*c(c为p指向数据类型所占的内存空间的字节数),
所以如果指针变量没有类型的话遇到这种情况时内存地址就不知道该移动多少字节才能正确访问到一下数据。

未完成......

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics