数据


  • 基本数据类型
  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. Lambda表达式和Java集合框架

    本文github地址 前言 我们先从最熟悉的Java集合框架(Java Collections Framework, JCF)开始说起. 为引入Lambda表达式,Java8新增了java.util. ...

  2. Prerender.io - 预渲染架构,提高AngularJS SEO

    近些年来,越来越多的JavaScript框架(即AngularJS,BackboneJS,ReactJS)变得越来越流行.许多公司和开发人员使用这些JavaScript框架开发应用程序.这些框架有很多 ...

  3. forEach、map、filter、some、every五个数组方法

    forEach() 方法对数组的每一个元素执行一次提供的函数. map() 方法创建一个新数组,其结果是该数组都执行一次函数,原函数保持不变. filter() 方法使指定函数测试数组的每一个元素,并 ...

  4. Gradle之恋-任务1

    任务作为Gradle的核心功能模块,而且Gradle的任务还可以具有自己的属性和方法,大大扩展了Ant任务的功能.由于任务相关内容比较多,分为两篇来探讨,本篇主要涉及到:任务的定义.任务的属性.任务的 ...

  5. Cocos2d-x shader学习3: sprite描边(Outline)

    Cocos2d-x 3.x的label使用了freetype字体引擎(http://www.freetype.org/),可以很轻松的实现描边和阴影效果.所以本篇文章只针对于sprite来实现描边效果 ...

  6. Java面试02|Java集合

    关于Java中并发集合有: (1)CouncurrentHashMap (2)CopyOnWriteArrayList (3)LinkedBlockingQueue (4)ArrayBlockingQ ...

  7. struts2知识点复习

    一. MVC Model 1:将所有的程序代码,都写到JSP页面中. Model 2:JSP(流程控制.数据显示) + JavaBean 改进的Model2:Servlet(流程控制) + Jsp(数 ...

  8. 浅谈python 手机crash和app crash循环执行问题

    ----------------引子---------------- app自动化测试人员经常遇见的问题,第一:手机抛的异常导致脚本循环停止!!!!!!!!第二:app抛的异常导致脚本循环停止!!!! ...

  9. PHP的错误处理

    PHP的错误处理机制 php的错误处理是比较复杂的, 本文讲解php中所有错误相关的重要知识点做一次梳理, 便于理解php的错误机制. 基础知识 在此之前, 先熟悉一下php error的基础知识 预 ...

  10. jQuery获取Select选择的Text和 Value(转,待测试确认)

    在自己写的第一个小项目的省市区联动的时候需要用到select,找到这篇文章.实在是觉得太好了,忍不住转过来.待日后测试后再修改整理次文章. 下面是文章原文 jQuery获取Select选择的Text和 ...