您的位置:首页 > 其它

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

结果


分析:


四:二维数组和二级指针

二维数组在内存中以一维的方式排布

二维数组的第一维是一维数组

二维数组的第二维才是具体的值

二维数组的数组名可看做常量指针

数组名

一维数组数组名代表数组首元素的地址

二维数组名代表二维数组的首元素的地址,二维数组的元素是一个一位数组

五:数组参数和指针参数

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));

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: