黑马程序员——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中也可以使用了。

6、关于指针和指针变量
指针 :  指针及内存地址。对于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指向数据类型所占的内存空间的字节数),
所以如果指针变量没有类型的话遇到这种情况时内存地址就不知道该移动多少字节才能正确访问到一下数据。

接下来一些很基础, 但是可能要注意一下的新手小提示 : 

在用scanf和printf函数输入和输出时,一定要记得int跟%d对应,long跟%ld对应,float和double%f对应

1. 每条语句结束时末尾加分号, 而不是每行末尾加分号. 

2. 在用scanf 和 printf 函数输入或输出时, 类型与格式控制符(如 int 对应 %d)要对应好. 否则可能产生输出与数据不一致. 

3.  使用scanf函数时, 输入时的格式要与双引号中的格式一致, 因此双引号中最好只出现各种格式控制符

4. 在数值运算, 要注意防止数据的溢出. 一旦超过类型最大值, 便可能导致数据丢失

5.  注意各种运算符的优先级, 需要时可以加 () 来保证运算顺序满足要求. 

原文地址:https://www.cnblogs.com/HtercelH/p/4033659.html