int (*a[10]) (int)

本文深入解析C语言中指针与函数数组的结合使用,通过实例代码详细讲解如何定义和使用指向函数的指针数组,以及如何调用这些函数。文章首先介绍了指针与数组的基本概念,随后逐步解析了指向函数的指针及其在数组中的应用。

这样的表达式可以遵循这样的规则:从右向左,由近及远,括号优先;比如
从a符号开始。其右边是[10],说明a是个数组,其中存了十个元素。
再看a的左边是一个*。说明数组中存的是指针。
现在在看(*a[10])的右边是(int);说明所存的指针是指向有一个int形参的函数
现在看(*a[10])的左边是个int ,说明指向的函数的返回值为int 类型;

下面是代码;不过为了简化,我把数组改成了长度为3。但是不影响理解。

#include <stdio.h>
int a1(int);
int a2(int);
int a3(int);
int main()
{
int (*a[3]) (int);
a[0] = a1;
a[1] = a2;
a[2] = a3;
int x1 = a[0](3);
int x2 = a[1](3);
int x3 = a[2](3);
printf("x1=%d\n",x1);
printf("x2=%d\n",x2);
printf("x3=%d\n",x3);
return 0;
}
int a1(int x){
printf("这是a1,其中x的值为:%d\n",x);
return x;
}
int a2(int x){
printf("这是a2,其中x的值为:%d\n",x);
return x;
}
int a3(int x){
printf("这是a3,其中x的值为:%d\n",x);
return x;
}

 

 

<think>在C语言中,int* a、int * a和int *a这三种声明方式在语法上是完全等效的。编译器在处理声明时,会忽略空格(除了用于分隔关键字和标识符的必要空格)。因此,这三种写法都声明了一个指向整型的指针变量a。 原因: C语言的语法规定,声明中的空格主要用于分隔标识符和关键字,以及标识符与标识符之间。在指针声明中,星号(*)与类型关键字(如int)之间的空格、星号与变量名之间的空格都是可选的。编译器会忽略这些多余的空格,因此无论星号靠近类型还是靠近变量名,或者两边都有空格,其含义都是相同的。 示例代码: ```c #include <stdio.h> int main() { int* a; // 星号靠近类型 int * b; // 星号两边都有空格 int *c; // 星号靠近变量名 int value = 10; a = &value; b = &value; c = &value; printf("a = %d, b = %d, c = %d\n", *a, *b, *c); return 0; } ``` 以上代码中,a、b、c都是整型指针,它们都指向同一个整型变量value,因此打印的结果都是10。 然而,需要注意的是,虽然这三种写法在声明单个指针时等效,但在声明多个指针时,写法上的差异可能会导致误解。例如: ```c int* a, b; ``` 这里,a是一个指针,而b是一个整型变量(不是指针)。因为星号(*)只作用于紧随其后的标识符。而如果写成: ```c int *a, b; ``` 结果是一样的。但是,如果我们想声明两个指针,应该这样写: ```c int *a, *b; ``` 或者更清晰的方式: ```c int *a; int *b; ``` 因此,虽然空格可以任意,但为了避免混淆,建议采用一种风格并保持一致。通常,有两种主流风格: 1. 星号靠近类型(int* a):强调指针是类型的一部分。 2. 星号靠近变量名(int *a):强调指针声明符*与变量名结合,并且在声明多个指针时不容易出错(因为每个指针都需要显式加星号)。 结论:在C语言中,int* a、int * a和int *a在语义上是完全相同的,但在实际编码中,应注意在声明多个指针时每个指针变量名前都必须加上星号。 §§相关问题§§: 1. 在C语言中,如何声明一个指向字符的指针? 2. 在声明多个指针变量时,为什么每个指针变量前都需要加上星号? 3. 指针变量在内存中占用多少字节? 4. 如何理解指针类型在C语言中的重要性? </think>在C语言中,`int* a`、`int * a`和`int *a`这三种声明方式是**完全等效的**,它们都声明了一个指向整型的指针变量`a`。编译器会忽略关键字和符号之间的空格,因此这三种写法在功能上没有任何区别。 ### 原因解析: 1. **C语言语法规则**: - C语言的编译器在解析声明时,会忽略空格(除非空格用于分隔标识符)。 - `*`作为指针声明符时,无论是贴近类型(`int*`)还是贴近变量名(`*a`),均被视为相同的语法结构。 - 空格在符号(如`*`)周围是自由的,不影响语义。 2. **实际代码验证**: ```c #include <stdio.h> int main() { int value = 42; int* a = &value; // 写法1:星号贴近类型 int * b = &value; // 写法2:星号两边有空格 int *c = &value; // 写法3:星号贴近变量名 printf("*a = %d, *b = %d, *c = %d\n", *a, *b, *c); return 0; } ``` **输出**: ``` *a = 42, *b = 42, *c = 42 ``` 所有指针都能正确访问`value`的值,证明三者功能相同。 3. **常见误解**: - 有人误以为`int* a, b`会声明两个指针,但实际上只有`a`是指针,`b`是普通整型变量。这与空格无关: ```c int* a, b; // a是指针,b不是指针! int *a, b; // 等价于上一行 ``` - 若要声明多个指针,必须对每个变量显式使用`*`: ```c int *a, *b; // a和b都是指针 ``` ### 编程风格建议: 尽管三种写法等效,但主流风格有两种: 1. **星号贴近类型(`int* a`)**: - 强调“指针类型”的概念(`int*`是一种类型) - 在声明单个指针时更直观 2. **星号贴近变量名(`int *a`)**: - 强调`*`是变量修饰符(与解引用操作符一致) - 在声明多个指针时更不易出错(`int *a, *b`) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值