对指针数组,数组指针,函数指针数组,函数数组指针的一些简单理解


 - 
#include<stdio.h>
int main()
{
 int arr[10] = { 0 };
 int(*p)[10] =  &arr ;//(*p)是一个指针,名为p,去掉指针名字就是类型int [10],说明它有能力指向一个有10个
                      //元素的数组,每个元素为int型。
 // 不能用arr赋值,它在这里只代表一个int元素,不是数组,但是该指针指向数组,所以会类型不匹配,应该是&arr。         
 int(*arr1[10])[10] = { p };//arr1先跟[10]结合,说明是一个有10个元素数组,去掉这个数组的名字和大小
                          //就是数组元素的类型为int(*)[10],说明该数组的10个元素,每个元素是一个指针,
                          //该指针有能力指向一个含有10个int元素的数组。
 int(*(* p2)[10])[10] = &arr1;//(*p2)是一个指针,名为p2,去掉指针的名字,就是指针的类型int(*[10])[10]
 //(*[10]),[10]的优先级高,说明该指针指向含有10个元素的数组,每个元素又是一个指针,这个指针又有能力
 //指向一个有10个元素数组,该数组的每个元素又是int型。
 int(**p4[10])[10] = { &p };//p4是一个数组,名为p4,去掉这个数组的名字和大小,就是数组元素的类型
 //int(**)[10] 元素类型是一个二级指针,二级指针有能力指向一个一级指针,这个一级指针有能力指向
 //含有10个元素的数组,每个元素又是int型。
 int(*(**p3)[10])[10] = &p2;//p3是一个二级指针,名为p3,去掉这个指针的名字,就是指针的类型
 //int(*[10])[10] 该类型就是说明这个指针能指向一个有10元素数组,每个元素又是一个指针变量,
 //这个指针变量又能指向一个含有10元素的数组,每个元素是int型。
}
#include<stdio.h>
extern char*arr3;//对“辅助.c"文件引用声明,对数组arr3这块空间以char*的形式访问。
               //相当于把数组arr的前四个字节的内容当成char*的地址。
extern char pc[];//对“辅助.c"文件引用声明,对指针变量pc这块空间以char型数组进行访问。
                //相当于把指针变量四个字节中存储的字符地址当成char字符数组处理。
int main()
{
 /*void p1(int, int);
 void p2(int, int);
 void p3(int, int);
 void p4(int, int);
 void p5(int, int);*/
 void(*arr[5])(int, int);//= { p1, p2, p3, p4, p5 };
 void(*(*p)[5])(int, int) = &arr;
 void(*(*arr1[10])[5])(int, int) = { p };//p是一级指针。
 void(*(**arr2[10])[5])(int, int) = { &p };//&p是二级指针。
 printf("%p\n", arr3);//ox64636261;因为它的前四个字节内容为abcd
 printf("%s\n", &arr3);
 printf("\n%s\n", (char*)(*(int*)pc));//char*pc = "abcdef";pc[]={12 53 56 35}(12535635是表示字符a的地址。
    //pc是数组名,代表首元素的地址,(12这个元素的地址(类型是char*)),把它的类型强制类型转换为int*
 //对他解引用时可以访问四个字节的内容,也就是12535635,然后把整型数字12535635强制类型转换为char*指针
 //然后可以输出整个字符串。
 printf("\n%s\n",(*(char**)pc));//pc是数组名,它代表数组首元素地址,(12这个元素的地址(类型是char*)),
 //然后把它强制类型转换二级字符指针,因为二级指针存放的是地址,所以解引用一次可以访问四个字节的内容
 //也就是12535635,解引用一次之后变成一级的字符指针,然后可以输出整个字符串。
 system("pause");
}

#include<stdio.h>
typedef int*(*p1)[10];
typedef int(*pfun1)(int, int);
int main()
{
 //   int p;
 //(int*)p;
 //(p1)p;
 (*((void(*)(void))0))();//把0强制类型转换成一个函数地址,该函数的参数为(void),返回类型是void。
 int(*pfun(const int, int(*)(intint)))(int, int);
 /*pfun1 pufun(const int, pfun1);*/
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值