【C和指针】笔记1
数据
- 基本数据类型
- 整型家族:包含字符,短整型,整型和长整型
整型相互之间大小规定如下:
长整型至少和整型一样长,而整型至少应该和短整型一样长。
short int至少16位,long int至少32位,缺省的int究竟是16位还是32位,通常这个选择的缺省值是这种机器的最为自然(高效)的的位数。
面对可移植性问题,对于char型变量来说,最好是把存储的变量的值限定在signed char 与 unsigned char的交集内,因为机器中的char是signed与unsigned这是不一定的。
两个基本概念:
字面值:字面值常量(我的理解就是字面意思上的值的大小),相当于以前书中说的常数。字面值可以用个加上后缀进行区分属于哪种字面值。
比如:加上L和l,可以使这个数被解释为long型整数。
字符常量:单引号包围的字符。
2.枚举类型
这是一个很好用的自然语言符号类型,可以在机器中使用自然语言表示一些值,来代表一些东西。
它的值为符号常量,而不是字面值的类型。
下面有两个概念很重要:
- 数据作用域的问题
变量在程序的某个部分被声明时,它只在程序的一定区域才能被访问。比如函数的局部变量的作用域局限于该函数体内。这个规则意味着两点:(1)其他函数无法通过这些变量的名字访问他们。(2)只有分属不同的作用域,你可以给不同的变量起同一个名字。
编译器可以确认四种作用域:文件作用域,函数作用域,代码块作用域和原型作用域。
- 代码块作用域
位于一对花括号之间的所有语句称为一个代码块。任何在代码块的开始位置声明的标识符都具有代码块作用域,他们可以被代码块中的所有语句访问。
图中标示为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的更多相关文章
- C++指针笔记
什么是指针: 指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址.通过指针我们可以直接对内存进行操作. 什么是地址: 比如你要给你朋友寄快递,在寄东西的时候是不是要填写地址,通过地址你的 ...
- C指针笔记
指针的学习 两个数比较大小,通过传递内容进行比较 #include <stdio.h> void swap(int *p1, int *p2){ int temp; //注意指变量*的两个 ...
- c指针 --笔记2返回指针值的函数
返回指针值的函数 一般带回指针值的函数,定义形式为: int *a (int x, int y); 看这个经典案例: #include <stdio.h> int main(int arg ...
- c语言指针笔记
一.int a[20]1. 数组名代表数组首元素的地址,不代表数组的地址2. 对数组名取地址代表整个数组的地址.a和&a代表的数据类型不一样 a代表数组首元素的地址 &a数组类型 in ...
- C语言中的指针笔记
C语言指针 得到变量的地址 可以使用&运算符找到变量保存在内存中的位置 int x = 1; printf("x的内存地址是"%p\n",&x) %p格式 ...
- C语言指针笔记01
int num = 90; 定义一个整型变量num int* ptr = # 定义一个整型指针变量ptr,指针变量ptr的类型取决于他所需要指向的变量,如这里,ptr要指向int类型变 ...
- C和指针笔记 3.8 static关键字
当用于不同的上下文环境时,static关键字具有不同的意思. 当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但标 ...
- C和指针笔记 3.7 存储类型
变量的破碎类型是指存储变量值的内存类型.变量的存储类型决定变量何时创建.何时销毁以及它的值将保持多久. 有三个地方可以用于存在变量:普通内存.运行时堆栈.硬件寄存器. 变量的缺省存储类型取决于它的声明 ...
- C和指针笔记 3.6链接属性
链接属性决定如何处理在不同文件中出现的标识符.标识符的作用域也它的链接属性有关,但这两个属性并不相同. 没有链接属性的标识符(none)总是被当作单独的个体,也就是说该标识符的多个声明被当作独立不同的 ...
- C语言学习之路
c语言学习 初识c语言 c语言数据类型.运算符和表达式(整数浮点数) 字符型数据/字符串 算术运算符和算术表达式(优先级,结合性等) 顺序程序设计(运算符之类内容,字符输入输出等) C/C++ 查看数 ...
随机推荐
- 原生js中slice()方法和splice()区别
slice()方法和splice()方法都是原生js中对数组操作的方法. slice(),返回一个新的数组,该方法可从已有的数组中返回选定的元素.例如:arrObject(start,end),sta ...
- 清空file文件域的方法
我们在实际应用中经常希望能把文件域给清空,比如使用change事件时,因为不清空再次选择同一文件时将不在触发change事件. 但是在IE中,由于安全设置的原因,是不允许更改文件域的值的,也就是不能使 ...
- shell [ff: 未找到命令
在学习shell脚本时遇到一个问题: [ff: 未找到命令 相信很多初学者都会遇到,再次说明一下,希望对大家有所帮助: shell脚本代码如下: #!/bin/bash echo -n " ...
- 获取bing图片并自动设置为电脑桌面背景(C++完整开源程序)
众所周知,bing搜索网站首页每日会更新一张图片,张张漂亮(额,也有一些不合我口味的),特别适合用来做电脑壁纸. 我们想要将bing网站背景图片设置为电脑桌面背景的通常做法是: 上网,搜索bing 找 ...
- 1753: [Usaco2005 qua]Who's in the Middle
1753: [Usaco2005 qua]Who's in the Middle Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 290 Solved: ...
- 1647: [Usaco2007 Open]Fliptile 翻格子游戏
1647: [Usaco2007 Open]Fliptile 翻格子游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 423 Solved: 173[ ...
- wxpython tab切换页面
最近没事学习下wxpython,发现很少有关于页面切换的demo,这边分享下2中切换的方法.第一种:利用wx.Notebook第二种:利用Sizer布局实现(自己写的),代码没有涉及到什么重构之类的优 ...
- PDO(20161107)
PDO MySQLI是针对MySQL数据库扩展的,是专门访问MySQL数据库的 PDO是一个数据库访问的一个扩展类,通过一个类访问多个数据库,就是一个数据访问抽象层,把类结合在一块了 可以访问别的数据 ...
- TSQL语句和CRUD(20161016)
上午 TSQL语句 1.创建数据库 create database test2; 2.删除数据库 drop database test2; 3.创建表 create table ceshi ( ids ...
- ZooKeeper的简单理解
1 ZooKeeper的一致性特点 概念 描述 备注 顺序一致性 以ZXID来保证事务的顺序性 原子性 以ZAB保证原子操作,要么成功,要么失败 单一视图 无论客户端从哪个服务器获取到关于应用的数据都 ...