指针数组和数组指针的区别&指针函数和函数指针的区别

本文详细解析了指针数组与数组指针的概念及其使用区别,并对比了指针函数与函数指针的特点,通过具体示例帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

指针数组和指针函数的本质没有变化,还是数组和函数。而数组指针函数指针,这是说明这是指针,指向的类型分别是数组和函数。

一、

指针数组:即用于存储指针的数组,也就是数组元素都是指针

char const *keyword[]={"we","we","wexx"};//表示指向不同字符串地址的字符类型的指针数组
int len=sizeof(keyword)/sizeof(keyword[0]);//计算指针数组的大小
printf("%d",sizeof(keyword[0]));//4
printf("最大的数是:%d\n",len);//3

数组指针:a pointer to an array,即指向数组的指针

还要注意的是他们用法的区别,下面举例说明。

int* a[4]     指针数组     

                 表示:数组a中的元素都为int型指针(即存储了四个指向整型数据的地址)  

                 元素表示:*a[i]   *(a[i])是一样的,因为[]优先级高于*

int (*a)[4]   数组指针     

                 表示:a是指向(或地址类型)一个一行含有四个元素数组地址的地址变量

                 元素表示:(*a)[i]  

例子说明:在下列函数中,apricot指向的是三列五行的数据表,apricot要访问下一页三列五行,通过的是apricot+1,而不是apricot[1],apricot[1]相当于*(apricot+1),它指向五行的数据组。

int main()
{
    int apricot[2][3][5]={{{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15}},
{{16,17,18,19,20},{21,22,23,24,25},{26,27,28,29,30}}};//两纵三行五列,下面指针所指向的维数不同
int (*r)[3][5]=apricot;//表示指向的是一个两纵数组int类型的首地址
int (*t)[5]=apricot[0];//表示指向的是一个三行数组int类型的首地址
int *s=apricot[0][0];//表示指向一个五列数组int类型的首地址
int u=apricot[0][0][0];//表示数组元素
printf("%x\n",***r);
printf("%x\n",**t);
printf("%x\n",*s);
printf("%x\n",***(r+1));
printf("%x\n",**(t+1));
printf("%x\n",*s+1);
    return 0;
}

分别打印出的值是:

1

1

1

10 

6

2
二、

指针函数:只是他的返回值 类型 是指针变量

函数指针:是一个 指针变量 ,只不过 它是 指向函数的 指针变量

如函数 int * A(intnum)是一个返回整型类型的指针

而 int (*pf)(intnum)是个函数指针,指向的类型是函数 int * A(int num)

所以有 pf = A,就把 函数A的首地址 赋值给 pf 函数指针了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值