指针和数组

来源:互联网 发布:淘宝达人的账号简介 编辑:程序博客网 时间:2024/06/10 15:52

指针,数组

指针和数组没有关系!!!!


指针数组
指针数组是数组,是一个存放指针的数组
int *arr[10]; 因为[ ] 比 * 优先级高,所以arr先和[ ]结合,所以它是一个数组
char *arr[10];

数组指针
数组指针是指针,指向一个数组的指针
int (*p)[10];
p是一个指针变量,指向的是具有十个元素的整型数组

然后我们来看这个:
int (*parr[10])[5];
*parr[10]; 是个指针数组
int (*)[5]; 是个数组指针
所以总体就是,它是一个指针数组,里面的指针都指向五个元素的一维数组

指针和数组的定义和声明
定义是不存在的东西要让他存在,声明是让知道有这么个东西的存在,又说声明就是定义变量本身
之前我们声明全局变量的时候是这样的: extren int a;

可是如果我们这么写:
//test.cchar arr[] = "abcdef";//main.cint main()
{
       printf("%s\n",arr);       return 0;}

会输出什么呢?
这么写的话,因为char arr[ ];时arr是一个七个元素的数组,会开辟七个空间,但声明时,会把arr当成指针来识别,别且只访问四个字节,如题,会将abcd赋给指针arr,并且会把abcd当成一个地址
所以这么写不一定能运行。

如果定义成指针,声明成数组呢?
char *p = "abcdef";
extren char p[ ];
指针指向的是常量字符串,且p是四个字节的,在识别char类型数组时,认为数组大小是4。访问数组是,输出的是p的地址的四个部分
所以不推荐这两种写法

函数指针

输出结果:

所以,函数也是有地址的,而且函数名和&函数名都表示的是函数的地址

所以就有函数指针
int (* pfun)(); //指向返回值为int,参数列表为空的函数的指针
void (*pfun)(); //指向返回值为void,参数列表为空的函数的指针

跟数组指针还是有点类似的,不过还要注意返回值,是不是想到了指针数组。。 int *arr[10]
而 int *pfun(); //看清楚,这是个函数,返回值为整型指针的函数!!!!

来看这两个:
(*(void (*)())0);void (*signal(int, void(*)(int)))(int);

代码1:(void (*)( )) 这一段,里面是个函数指针,外面带括号就是强制转换,所以把0强制转换成函数指针,再解引用,就是可以理解为 地址(); 这个样子,这里地址 == 0,因为上面提到过函数名就是它的地址,0( ); 这个后面带括号带封号,就是函数调用

代码2:signal(....)是个函数,参数是int和函数指针,而signal函数的返回值是函数指针,这个指针指向的是返回值为void *,参数为int的函数

函数指针数组
int (*parr[10]) ();
因为parr先河[ ] 结合,所以它是个数组,其次又是个指针,最后是函数,所以是函数指针数组
一类指针放在一个数组中,都会返回值为int,参数为空的函数


函数指针的数组的指针
指向函数指针数组的指针
一个指针,指向的是一个函数指针数组
定义: void (*(*ppfunarr)[10])(const char*);

综合对比:
函数指针 int (*pfun)(int,int);
函数指针数组 int (*pfunarr[5])(int, int);
函数指针数组的指针: int (*(*ppfunarr)[5])(int, int)
!!!!关键在于符号的优先级!!!!

还有指向函数指针数组指针数组的指针等等可以无限延伸。。。不过代码是写给人看的,基本不会用到





原创粉丝点击