指针与数组,与函数,与指针

本文详细解析了指针数组与数组指针的概念及其区别,并介绍了指向二维数组的指针的不同表达方式,同时还探讨了指针函数与函数指针的定义及使用方法。

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

指针数组

指针数组就是一个数组,这个数组里面的元素是指针。

一般形式为: 类型标识符 * 数组名[数组长度]

比如

int *array[10];

上例中,[ ] 优先级高,与左边的array合并成为数组,array是数组名,int *说明这个数组是一个整型指针数组,这个数组里面的所有元素都是指向整型的指针。

 

数组指针

数组指针又称行指针,是一个指针,这个指针指向一个数组的首地址。

一般形式为:类型标识符 (*指针变量名)[数组长度]

int (*p)[10];

上例中, ( ) 优先级高,则变量p是一个指针,这个指针指向一个长度为10的一位数组的首地址。

 

指向二维数组的指针的几种表达方式

定义一个整型二维数组a[3][4]

表现形式含义地址值
&a指向二维数组的指针0x1000
a数组名,0行首地址0x1000
a[0], *(a+0), *a第0行第0列地址0x1000
a+1, &a[1]第1行首地址0x1006
a[1], *(a+1)第1行第0列地址0x1006
a[1]+2, *(a+1)+2, &a[1][2]第1行第2列地址0x1010
*(a[1]+2), *(*(a+1)+2), a[1][2]第1行第2列值数组值11

 

 

 

 

 

 

 

 

&a[i] 并不是 a[i] 的物理地址,在内存中 &a[i]并不存在, &a[1] 只是一个地址计算方法, 但C语言允许这样的操作。

a+i = a[i] = *(a+i) = &a[i] = &a[i][0]  它们的地址值相等

 

指针函数

指针函数,它是一个函数,它的函数类型是指针,即这个函数的返回值是一个指针。

声明格式为:类型标识符 * 函数名( 参量表 )

比如

char * fun(int x,int y)

上例中,( ) 优先级高,与fun合并成为函数,fun是函数名,char * 说明这个函数的返回值是一个字符型的指针,是一个地址。

函数指针

函数名是一个函数的首地址(入口地址),把这个首地址赋予给一个指针变量,使该指针指向该函数。然后通过指针变量就可以找到并调用这个函数。这个指向函数的指针变量就被成为函数指针变量。

声明格式为:类型说明符 (*指针变量名)(参数)

void print()
{
    printf("helloworld\n");
}
int add(int x, int y)
{
    return x + y;
}
int main()
{
    void (*p)();
    int (*q)(int, int);
    p = print;
    q = add;
    p();
    printf("%d\n", q(1, 2));
}

上例中,变量 p和q都是函数指针 。变量p是一个无参量返回值为void类型的指针,指向函数print();变量q是一个有两个整型参量返回值为int的指针,指向函数add()。

 

(未完待续)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值