5--指针与数组(下)
2016-04-25 20:30
169 查看
一:定义数组类型(数组元素类型+数组大小)
typedef type(name)[size]
例如:typedef int(AINT5)[5];
typedef float(AFLOAT10)[10];
AINT5 iarry;
AFLOAT10 ifloat;
二:数组指针和指针数组
数组指针:是一个指针,指向一个数组
指针数组:是一个数组,数组元素为指针
数组指针定义:arraytype *point或者type (*point)
typedef float(AFLOAT10)[10]; //定义一个数组类型
float fArray[10]; //定义一个数组
AFLOAT10* pf = &fArray; //定义一个数组指针
for(i=0; i<10; i++){ //数组元素赋值
(*pf)[i] = i;
}
for(i=0; i<10; i++){ //数组元素打印
printf("%f\n", (*pf)[i]);
}
指针数组的定义:type* pArray
;
type *为数组中每个元素的类型
pArray为数组名,n为数组大小
例如:
const char* keyword[] = {
"do",
"for",
"if",
"register",
"return",
"switch",
"while",
"case",
"static"
};
printf("%s\n",keyword[1]);
打印结果:for
附:const int ar[5];
printf("%d\n",sizeof(ar)); \\数组所占空间的大小
printf("%d\n",sizeof(*ar)); \\数组元素所占空间的大小
#define DIM(a) (sizeof(a)/sizeof(*a)) \\一个数组中有多少元素
三:指向指针的指针?????
指针变量在内存中会占用一定的空间
可以定义指针来保存指针变量的地址值
为什么需要指向指针的指针
指针在本质上也是变量
对于指针也同样存在传值调用和传址调用
int a=0;
int *p=NULL;
int **pp=NULL;
pp=&p;
*pp=&a; //22fe38=p=&a=22fe44
printf("%0X\n", &a);
printf("%0X\n", p);
printf("%0X\n", *p);
printf("%0X\n", pp); //
printf("%0X\n", *pp); //变量a的地址值
printf("%0X\n", **pp); //打印变量a=0
结果
![](http://img.blog.csdn.net/20160425194007476?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
分析:
![](http://img.blog.csdn.net/20160425210326798)
四:二维数组和二级指针
二维数组在内存中以一维的方式排布
二维数组的第一维是一维数组
二维数组的第二维才是具体的值
二维数组的数组名可看做常量指针
数组名
一维数组数组名代表数组首元素的地址
二维数组名代表二维数组的首元素的地址,二维数组的元素是一个一位数组
五:数组参数和指针参数
C语言中只会以值拷贝的方式传递参数
当向函数传递数组时,将数组名看做常量指针传数组首元素的地址
因为C语言以高效为最初设计目的,在函数传递整个数组,如发生数组拷贝,执行效率大大下降
![](http://img.blog.csdn.net/20160425195615810?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
六:函数类型
C语言的函数有自己的特定类型
函数类型由返回值,参数类型和参数个数共同决定
通过typedef为函数类型重命名
typedef type name(parameter list)
例:typedef int f(int,int);????怎么使用
七:函数指针
函数指针用于指向一个函数
函数名是执行函数体的入口地址
可通过函数类型定义函数指针 FUNCTYPE * pointer
也可以直接定义 type (*point)(parameter list);
typedef int(FUNC)(int); //定义一个函数类型
int test(int i){} //一个函数
FUNC* pt = test; //定义一个函数指针,并初始化
pt(2) //使用函数
或者(*pt)(2) //使用函数结果和上相同
八:回调函数
个人认为:利用函数指针作为函数参数实现的一种调用机制
回调函数机制原理:
调用者不知道具体事件发生的时候需要调用哪一个的具体函数
被调函数也不知道何时被调用,只知道被调用后需要完成某些任务
当具体事件发生时,调用者通过函数指针调用具体的函数
回调机制将调用者和被调用者分开,两者互不依赖
例如:
typedef int(*FUNCTION)(int); //定义函数类型
int g(int n, FUNCTION f){} //调用机制
int f1(int x){} //函数体一,执行具体的任务
int f2(int x){}
int f3(int x){}
int main()
{
printf("x * f1(x): %d\n", g(3, f1));
printf("x * f2(x): %d\n", g(3, f2));
printf("x * f3(x): %d\n", g(3, f3));
}
typedef type(name)[size]
例如:typedef int(AINT5)[5];
typedef float(AFLOAT10)[10];
AINT5 iarry;
AFLOAT10 ifloat;
二:数组指针和指针数组
数组指针:是一个指针,指向一个数组
指针数组:是一个数组,数组元素为指针
数组指针定义:arraytype *point或者type (*point)
typedef float(AFLOAT10)[10]; //定义一个数组类型
float fArray[10]; //定义一个数组
AFLOAT10* pf = &fArray; //定义一个数组指针
for(i=0; i<10; i++){ //数组元素赋值
(*pf)[i] = i;
}
for(i=0; i<10; i++){ //数组元素打印
printf("%f\n", (*pf)[i]);
}
指针数组的定义:type* pArray
;
type *为数组中每个元素的类型
pArray为数组名,n为数组大小
例如:
const char* keyword[] = {
"do",
"for",
"if",
"register",
"return",
"switch",
"while",
"case",
"static"
};
printf("%s\n",keyword[1]);
打印结果:for
附:const int ar[5];
printf("%d\n",sizeof(ar)); \\数组所占空间的大小
printf("%d\n",sizeof(*ar)); \\数组元素所占空间的大小
#define DIM(a) (sizeof(a)/sizeof(*a)) \\一个数组中有多少元素
三:指向指针的指针?????
指针变量在内存中会占用一定的空间
可以定义指针来保存指针变量的地址值
为什么需要指向指针的指针
指针在本质上也是变量
对于指针也同样存在传值调用和传址调用
int a=0;
int *p=NULL;
int **pp=NULL;
pp=&p;
*pp=&a; //22fe38=p=&a=22fe44
printf("%0X\n", &a);
printf("%0X\n", p);
printf("%0X\n", *p);
printf("%0X\n", pp); //
printf("%0X\n", *pp); //变量a的地址值
printf("%0X\n", **pp); //打印变量a=0
结果
分析:
四:二维数组和二级指针
二维数组在内存中以一维的方式排布
二维数组的第一维是一维数组
二维数组的第二维才是具体的值
二维数组的数组名可看做常量指针
数组名
一维数组数组名代表数组首元素的地址
二维数组名代表二维数组的首元素的地址,二维数组的元素是一个一位数组
五:数组参数和指针参数
C语言中只会以值拷贝的方式传递参数
当向函数传递数组时,将数组名看做常量指针传数组首元素的地址
因为C语言以高效为最初设计目的,在函数传递整个数组,如发生数组拷贝,执行效率大大下降
六:函数类型
C语言的函数有自己的特定类型
函数类型由返回值,参数类型和参数个数共同决定
通过typedef为函数类型重命名
typedef type name(parameter list)
例:typedef int f(int,int);????怎么使用
七:函数指针
函数指针用于指向一个函数
函数名是执行函数体的入口地址
可通过函数类型定义函数指针 FUNCTYPE * pointer
也可以直接定义 type (*point)(parameter list);
typedef int(FUNC)(int); //定义一个函数类型
int test(int i){} //一个函数
FUNC* pt = test; //定义一个函数指针,并初始化
pt(2) //使用函数
或者(*pt)(2) //使用函数结果和上相同
八:回调函数
个人认为:利用函数指针作为函数参数实现的一种调用机制
回调函数机制原理:
调用者不知道具体事件发生的时候需要调用哪一个的具体函数
被调函数也不知道何时被调用,只知道被调用后需要完成某些任务
当具体事件发生时,调用者通过函数指针调用具体的函数
回调机制将调用者和被调用者分开,两者互不依赖
例如:
typedef int(*FUNCTION)(int); //定义函数类型
int g(int n, FUNCTION f){} //调用机制
int f1(int x){} //函数体一,执行具体的任务
int f2(int x){}
int f3(int x){}
int main()
{
printf("x * f1(x): %d\n", g(3, f1));
printf("x * f2(x): %d\n", g(3, f2));
printf("x * f3(x): %d\n", g(3, f3));
}
相关文章推荐
- 无人机学习第一波
- [CODEVS1090][NOIP2013]加分二叉树(树形dp)
- 如何更改workbench的快捷键
- HDU1576 A/B (解法二)
- Educational Codeforces Round 12 D. Simple Subset
- c++第四次作业
- iOS边练边学--多线程练习的多图片下载 以及 使用第三方框架(SDWebImage)的多图片下载
- 线程同步与互斥之条件·变量
- 定时自动启动任务crontab命令用法
- poj 2373(单调队列优化dp)
- (2.2.9)Groovy 介绍
- 对UIView 实例方法的探索
- HBase总结(十一)hbase Java API 介绍及使用示例
- STEM教育 or steam教育 art
- D The Lucky Week
- HDU 1283 最简单的计算机(switch+string)
- 在一个UILabel中实现不同的字体和颜色
- RocketMQ 部署
- Solr REST操作:增删改查
- 【POJ】[3273]Monthly Expense