数据


  • 基本数据类型
  1. 整型家族:包含字符,短整型,整型和长整型

整型相互之间大小规定如下:

长整型至少和整型一样长,而整型至少应该和短整型一样长。

short int至少16位,long int至少32位,缺省的int究竟是16位还是32位,通常这个选择的缺省值是这种机器的最为自然(高效)的的位数。

面对可移植性问题,对于char型变量来说,最好是把存储的变量的值限定在signed char 与 unsigned char的交集内,因为机器中的char是signed与unsigned这是不一定的。

两个基本概念:

字面值:字面值常量(我的理解就是字面意思上的值的大小),相当于以前书中说的常数。字面值可以用个加上后缀进行区分属于哪种字面值。

比如:加上L和l,可以使这个数被解释为long型整数。

字符常量:单引号包围的字符。

  2.枚举类型

这是一个很好用的自然语言符号类型,可以在机器中使用自然语言表示一些值,来代表一些东西。

它的值为符号常量,而不是字面值的类型。

下面有两个概念很重要:

  • 数据作用域的问题

变量在程序的某个部分被声明时,它只在程序的一定区域才能被访问。比如函数的局部变量的作用域局限于该函数体内。这个规则意味着两点:(1)其他函数无法通过这些变量的名字访问他们。(2)只有分属不同的作用域,你可以给不同的变量起同一个名字。

编译器可以确认四种作用域:文件作用域,函数作用域,代码块作用域和原型作用域。

  1. 代码块作用域

位于一对花括号之间的所有语句称为一个代码块。任何在代码块的开始位置声明的标识符都具有代码块作用域,他们可以被代码块中的所有语句访问。

图中标示为6,7,9,10的变量具有代码块作用域。有一种情况,如果内层的标识符名字与外层的标识符名字相同,比如图中6的f与9的f是不同的变量,内层会屏蔽外层的变量,所以在9处使用的是内层的f。

  2. 文件作用域

任何在所有代码块之外声明的标识符都具有文件作用域,它表示这个标识符从声明之处直到所有源文件结尾处都是可以访问的。

图中 1和2属于这一类,函数和变量。应该指出的是在头文件中编写,并通过#include指令包含到其他文件中的声明,就好像他们直接写在文件中一样。

  3. 原型作用域

原型作用域只适合函数原型声明的参数名。

如图中声明的3和8。原型作用域是为了防止函数原型声明时这些参数名与其他部分名字冲突。唯一可能的冲突就是在同一个原型上不止一次的使用同一个名字。

  4.函数作用域

它只适用于语句标签,语句标签用于goto语句,作者说希望你永远不要用到这个知识。

  • 链接属性

第一次看到这个词,何为链接属性,我们来看看。

标识符的链接属性决定如何处理在不同文件中出现的标识符。标识符的作用域与链接属性有关,但是两个属性并不相同。

链接属性有三种:external(外部),internal(内部),none(无)

属于external链接属性的标识符不论声明几次,位于几个源文件都表示同一个实体。

属于internal链接属性的标识符在同一源文件中的所有声明都指向同一个实体,但位于不同源文件的多个声明分属不同的实体。一句话就是说,这个属性是把变量绑在这个源文件中的。

属于没有链接属性的标识符,总是被当做单独的个体,也就是说他的多个声明被当做独立不同的实体。

这里主要提两个重点关键词:extern,static用于声明中修改标识符的链接属性。

static可以使原本为external属性的变为internal属性。这样的好处是让本文件中的变量和函数只是在这个文件中使用,也可以避免和其他文件的命名冲突。

extern为一个标识符指定external链接属性,这样可以在其他文件中访问这个标识符。

  • 存储类型

可以存储变量的三个地方:普通内存,运行时的堆栈,硬件寄存器

变量的缺省存储位置取决于他的声明位置。

静态变量:凡是在任何代码块之外的声明的变量总是存储于静态内存,也就是不属于堆栈的内存,对于这类变量你无法为其指定其他的存储类型。静态变量在程序运行之前创建,在程序的整个执行区间都存在。始终保持原值。

自动变量:代码块内部声明的变量的缺省存储类型是自动的,存储于堆栈中的。auto关键词是修饰这个变量的,不过一般不使用。局部变量,程序执行到声明的地方,变量创建,程序离开代码块,变量自行销毁。

两个static声明:

前面提到一个链接属性的static,他是用来修改变量的链接属性,把external改为internal

而在代码块内部,对一个自动变量加上static声明后,可以使它的属性从自动变为静态变量。但是修改变量的存储类型,并不修改该变量的作用域。

最后

 /*a,b,c的存储类型为静态*/
int a=; //全局变量
extern int b; //具有external属性的全局变量
static int c; //静态 int func(int e)
{
int f=; //自动变量
register int b;
static int g=;
extern int a; //多余的,这个代码块位于第一行声明的作用域
...
{
int e;
int a; //同名变量使用局部的
extern int h; //具有external链接属性,存储于静态内存中
...
}
...
{
int x;
int e;
...
}
...
} static int func2() //具有静态链接属性,可以防止它被源文件之外的任何函数调用
{
...
}

【C和指针】笔记1的更多相关文章

  1. C++指针笔记

    什么是指针: 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.通过指针我们可以直接对内存进行操作. 什么是地址: 比如你要给你朋友寄快递,在寄东西的时候是不是要填写地址,通过地址你的 ...

  2. C指针笔记

    指针的学习 两个数比较大小,通过传递内容进行比较 #include <stdio.h> void swap(int *p1, int *p2){ int temp; //注意指变量*的两个 ...

  3. c指针 --笔记2返回指针值的函数

    返回指针值的函数 一般带回指针值的函数,定义形式为: int *a (int x, int y); 看这个经典案例: #include <stdio.h> int main(int arg ...

  4. c语言指针笔记

    一.int a[20]1. 数组名代表数组首元素的地址,不代表数组的地址2. 对数组名取地址代表整个数组的地址.a和&a代表的数据类型不一样 a代表数组首元素的地址 &a数组类型 in ...

  5. C语言中的指针笔记

    C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...

  6. C语言指针笔记01

    int num = 90; 定义一个整型变量num int* ptr = &num; 定义一个整型指针变量ptr,指针变量ptr的类型取决于他所需要指向的变量,如这里,ptr要指向int类型变 ...

  7. C和指针笔记 3.8 static关键字

    当用于不同的上下文环境时,static关键字具有不同的意思. 当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但标 ...

  8. C和指针笔记 3.7 存储类型

    变量的破碎类型是指存储变量值的内存类型.变量的存储类型决定变量何时创建.何时销毁以及它的值将保持多久. 有三个地方可以用于存在变量:普通内存.运行时堆栈.硬件寄存器. 变量的缺省存储类型取决于它的声明 ...

  9. C和指针笔记 3.6链接属性

    链接属性决定如何处理在不同文件中出现的标识符.标识符的作用域也它的链接属性有关,但这两个属性并不相同. 没有链接属性的标识符(none)总是被当作单独的个体,也就是说该标识符的多个声明被当作独立不同的 ...

  10. C语言学习之路

    c语言学习 初识c语言 c语言数据类型.运算符和表达式(整数浮点数) 字符型数据/字符串 算术运算符和算术表达式(优先级,结合性等) 顺序程序设计(运算符之类内容,字符输入输出等) C/C++ 查看数 ...

随机推荐

  1. jquery.datetimepicker.js 当鼠标离开时,不选中当前时间,以达到清空的目的

    validateOnBlur:true    当鼠标离开时,不选中当前时间,以达到清空的目的 使用方法:   // 时间设置         $('#BankProduct_sale_begin'). ...

  2. 使用NTP协议服务器时间同步

    NTP是用来使系统和一个精确的时间源保持时间同步的协议.建议大家在自己管理的网络中建立至少一台时间服务器来同步本地时间,这样可以使得在不同的系统上处理和收集日志和管理更加容易.我们分别从windows ...

  3. (七)javascript中的数组

    一. 一维数组 1.1 声明数组 var 数组名=new Array(数组大小); 1.2  添加元素 <script> var a=new Array(3); a[0]="张三 ...

  4. ajax bookstrap美化网页,并实现页面的加载,删除与查看详情

    Bookstrap:美化页面: Bootstrap是Twitter推出的一个开源的用于前端开发的工具包.它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS ...

  5. 新学期的第一节Android课

    老师问,你们认为师生关系是什么样子的? 机智的我很快想到啦:或许是猫和老鼠的关系吧,嘿嘿O(∩_∩)O

  6. python 语法笔记(一)

    #python3里面input默认接收到的事str类型,而python2里面却认为是int类型n=int(input('请输入想要第几个数')) #如果将int省去,python3中该程序将会报错a, ...

  7. JNDI常见配置方式

    JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...

  8. ng-class 用法

    很长时间不写页面很多angualrjs的指令用法忘了,搜搜网上的千篇一律“不全”: 下面我把ngclass的用法列出来!(注:网上只有2种,我补充一种三维运算) 1:   ng-class=" ...

  9. 解决华为手机不打印Log信息的问题

    在之前安装了Android Studio后,发现了一个很苦恼的事情,就是在程序中的写Log语句,不能正常的在Logcat中打印出来,这对于解决程序bug真是一刀切断,让人无从下手,在各种尝试后,首先我 ...

  10. Python中的内置函数__init__()的理解

    有点意思,本来我是学习java的.总所周知,java也有构造函数,而python在面向对象的概念中,也有构造函数.它就是 __init__(self) 方法. 其实类似于__init__()这种方法, ...