C可以说是一门非常重要的功课了,看似非常简单,其实又博大精深,到现在为止我也有些知识点不是很清楚,继续学习中。本文就C语言中的指针、数组、函数相关的知识做个总结。
1 数组
数组是具有相同数据类型的有序集合,并且用唯一的名字来标识,其元素可以通过下标来引用,因此,可以方便地将数组用于循环,从而降低程序的复杂性。数组可以是一维的或多维的,所有的元素占据连续的存储单元,首地址对应第一个元素的存储地址。
一维数组的一般定义方式是:类型符 数组名[元素个数] ;
“类型符“说明该数组元素的数据类型
“数组名”为一合法的标记符
“元素个数”为数组长度,可以是整形常量表达式,但不能含有变量
如:char data[10];
牢牢记住这个定义格式吧!
二维数组的一般定义方式是:类型符 数组名[num1][num2];
一维数组明白后,二维多维数组都可以归结到一维数组,如下示:
类型符 数组名[num1][num2] ;
\ /
\ /
\ /
\ /
类型符A 数组名[num1]
是不是二维变一维了?实际上二维数组是一种特殊的一维数组罢了,只不过两者的数组元素类型不同罢了。
2 指针
通常,一个内存地址在C中更习惯于被称为指针,并且说是“指向”某一变量或内存中的某一位置。
指针可以说就是地址,存储地址需要专门的变量,就是指针变量。
指针的一般定义方式是:类型符 *变量名;
牢牢记住这个定义形式吧!
“类型符”是指针变量所指向的数据的类型
“*”是一个标识符,说明该变量是一个具有指针类型的变量
说到指针必然离不开两个运算符&和*,在此不再赘述,看下示例。
Int x=5,y=6,*p;
P = &x;
(*p) = 3;
下列情形是万万不允许的
int *p; p=200;
int *p; *p=200;
通常的指针初始化如下
Char *p = (char*)0xb0000000;
Char *p = “hello”;
Int x=3, *p;
P = &x;
3 函数
函数就是完成特定功能的相对独立的代码段,它具有输入输出参数,其定义形式如下:
类型符 函数名(型参列表)
{
/* 函数代码 */
}
也牢牢记住这个定义形式吧,因为这些都是最最基本的。
4 关联
让我们通过一些例子说明上述三者之间的交叉关系吧。
4.1 int dat[10], *p;
p=a; 或 p=&a[0];
这里p完成了对一维数组dat的指针操作
也可以说p是dat的第二个名字
4.2 int (*p)[5];
这里p是什么啊?p是指向数组类型的指针变量。
对于这样有点眼花的东东,一个识别真伪的方法就是
(1)牢记指针、数组、函数定义的原型
(2)以名字为中心
(3) []和()具有相同的优先级,且高于*
下面就让我们看看这个p
以名字为中心先看p,这里是*p,并且有()括起来,回忆指针定义的原型就知道了,p是个指针,它指向的数据类型是什么?是一个数组int [5]。
让我们把它打回原型看看
int (*p)[5];
|
A *p; 这里A就是int [5]了
int x[5];
|
A x; 这里A就是int [5]了
int x;
这是最基本的定义格式,所有的复杂最终都会回归到这个原始。
4.3 int *p[5];
这个p是什么啊?p是指针数组。
按照上述方法分析
[]优先级高,一看[],再回忆数组的定义原型就知道了,p是个数组,数组的基类型是什么?是int *啊,所以p是一个基类型为指向int类型指针的数组,即指针数组。
4.4 int *p( );
这个p是什么啊?p是函数。
()优先级高,一看(),再回忆函数定义的原型就知道了,p是函数,函数的返回类型是int *罢了。
4.5 int (*p)( );
这个p是什么啊?p是指向函数的指针。
以名字为中心,先看(*p),p是指针,再看(),是函数,即为指向函数的指针。
打回原型int (*p)( );
|
A *p; 这里A就是int ()了
5 总结
数组、指针、函数是C中最基本的东西,只要抓住它们的本质,再怎么变化都会一目了然。
阅读(1516) | 评论(1) | 转发(0) |