C语言解惑(1)
来源:互联网 发布:java服务端开发是什么 编辑:程序博客网 时间:2024/06/06 01:07
C语言解惑(1)
近几天在到处找工作,跑各大宣讲会、校园招聘会。也经过了几次笔试,现将笔试过程当中的一些疑惑整理整理。
static的用法
经过多方查询,我将static的用法归为三条
- 最重要的一个用法:隐藏
static会限制变量或函数的“可见性”,使变量和函数只在本文件中是可见的,而外部文件无法访问。举例说明下,假设有两个文件,分别是a.c,main.c。
以下为a.c的内容
char a = 'C'; //global variablevoid fun(){ printf("Hello\n");}
以下为main.c的内容
int main(){ extern char a; //extern variable fun(); printf("%c ",a); return 0;}
程序运行结果为:Hello C
而如果在a.c中这样定义
static char a = "C";static void fun(){ printf("Hello\n");}
则在main.c中就无法调用a和fun()了。以上程序就会报错了。
利用这一特性可以在不同的文件中定义同名变量和同名函数,而不比担心命名冲突。
- 使变量的寿命悠长
一般变量存储在栈中,要用时分配一块空间,用完后就回收了。而static使变量存储在静态数据区,在程序刚运行时就完成初始化,分配一块空间,一直到程序运行结束。这和全局变量是一样的,所以说static最主要的作用还是隐藏。
利用这一特性可以用来计数,比如记录某一函数被调用了多少次。在我们单片机编程当中,可以设置flag等。
- 默认初始化为0
在静态数据区,内存中所有的字节默认值都是0x00。所以static会默认初始化为0,和全局变量一样。
指针数组和数组指针
指针数组:以数组为中心词,即用于存储指针的数组,其本质为数组,而数组的元素为指针。
数组指针:以指针为中心词,即指向数组的指针,其本质为指针,只是指向一个数组。
它们的定义如下:
int* a[2]; //指针数组int (*a)[2]; //数组指针
它们的用法如下:
#include <stdio.h>int main(){ int c[2]={1,2}; int* a[2]; //指针数组 int (*b)[2]; //数组指针 b = &c; //数组指针b指向数组c //将数组c中的元素赋给数组a for(int i = 0; i < 2; i++) { a[i] = &c[i]; } //输出,看结果如何 printf("*a[0] = %d\n",*a[0]); //应输出为1 printf("(*b)[1] = %d\n",(*b)[1]); //应输出2}
指针函数和函数指针
指针函数:其本质是一个函数,只是函数的返回值为指针类型。
函数指针:其本质为一个指针,但这个指针指向一个函数。
它们的定义如下:
int* f(int a ,int b); //指针函数int (*f)(int a ,int b); //函数指针
指针常量和常量指针
指针常量:以常量为中心词,其本质为常量,不过是指针类型的常量。简单点说就是这个指针指向一个固定的地址,不可改变,但这个地址中存储的值是可以改变的。
常量指针:以指针为中心词,其本质为一个指针,但这个指针指向一个常量。也就是说,它指向的值不可改变,但这个指针可以改变。
举例说明:
//指针常量int* const b = &a;*b = 2; //合法的b = &c; //非法的//常量指针const int* b = &a;*b = 2; //非法的b = &c; //合法的
另外说一个指向常量的指针常量
顾名思义,它是一个常量,且它指向的对象也是一个常量。
定义为:const int* const b = &a;
小结:
可以看到以上三组关于指针的辨识比较绕,仔细一看,其重点也就是中心词其实都在后面。其实说来,这些名词看英文会比较清晰明了,比如:
指针数组:array of points
数组指针:a point to an array
- C语言解惑(1)
- C语言解惑要点
- C语言答疑解惑
- C语言指针快速解惑
- C语言之常见问题解惑
- C语言浮点数解惑
- 《C语言解惑》源码笔记摘录(Updating)
- C语言的历史以及疑点解惑
- C语言指针问题快速解惑
- C语言指针问题快速解惑
- 转:C语言指针问题快速解惑
- C语言指针问题快速解惑
- C语言指针问题快速解惑
- C语言解惑:什么是数组名
- 专业书籍之一《C语言解惑》小感悟
- 《C语言解惑》读后总结
- 《C语言解惑》之 谜题2.3 其他类型的转换
- 《C语言解惑》之 谜题1.2 赋值操作符
- JavaSE系列第二篇——java异常机制
- 紫书动规 例题9-13 UVA
- Android开发环境(eclipse下)条目介绍
- Codeforces Round #404 (Div. 2) C. Anton and Fairy Tale(二分)
- Clipboard.js 不依赖Flash,把浏览器内容复制到系统剪贴板
- C语言解惑(1)
- 读书笔记7 《深阅读》 斋藤孝
- MySql接口API函数综述
- Mysql 数据库小记
- 引号的内容会被当成字符串
- struts2总是提示StringUtils错误
- Binary Tree的前、中、后序遍历(recursion)
- 创建简单SpringMVC项目
- 结构型模式-组合(composite)