int *a[10]与int (*a)[10]的区别,

本文详细解析了 C++ 中 int*a[10] 和 int(*a)[10] 的区别,前者定义了一个包含 10 个整型指针的数组,后者定义了一个指向整型数组的指针。同时介绍了如何使用数组引用作为函数形参,并展示了通过引用传递数组时如何保持其长度信息。

int *a[10]; 定义了一个指针数组,即10个int * 类型的指针。

int (*a)[10]; 定义了一个指向行的指针变量,注意是”一个”指针变量,而上面的指针数组是”10个”指针变量。指向行的指针变量可以用来指向二位数组int x[N][10],

a指向x即:

a <==> x 或者 x[0] 或者 &x[0][0]

a+1 <==> x[1] 或者 &x[1][0]

a+2 <==> x[2] 或者 &x[2][0]...

另外:*(a+i)+j <==> x[i][j]

int (*)a[10]没有这种用法


微笑微笑数组的引用作为函数形参:

当参数是数组的名字时,函数接收数组的首地址,维数丢失
当参数是数组的引用时,函数接收数组的首地址和维数
int sz[10];
void function(int *p, int size);//传名字的一般的写法
void function(int (&arr)[10]);//传引用的一般的写法


  1. #include <iostream>  
  2. using namespace std;   

  3. void fun(char (&buff)[11])//括号里必须有11才不报错 
  4. { 
  5.     cout<< buff; 
  6. }   

  7. int main(int argc, char *argv[])  
  8. {  
  9.     char buff[] = "helloworld";  
  10.       
  11.     fun(buff);  
  12.       
  13.     return 0;  
  14. }  
  15.  
  16. c++的数组类型是带有长度信息的,引用传递时如果指明是数组则必须指定长度


在 C/C++ 中,指针声明的写法 `int *a` 和 `int* a` 在语法上是等价的,它们都表示 `a` 是一个指向 `int` 类型的指针。这种等价性源于 C 语言的设计规则,即类型修饰符(如 `*`)可以紧接在类型关键字之后,也可以变量名之间存在空格。因此,无论采用哪种写法,其语义均一致[^1]。 然而,从可读性和风格的角度来看,这两种写法在表达意图上略有差异: - **`int* a`**:这种写法强调类型是“指向 `int` 的指针”,将 `*` 类型结合,有助于在声明多个变量时明确每个变量的类型。例如: ```c int* a, b; // a 是 int*,b 是 int ``` 但此写法可能导致误解,认为 `b` 也是指针类型,实际上并非如此。因此,这种方式更适合用于单个变量的声明。 - **`int *a`**:这种写法更符合 C 语言的传统风格,将 `*` 变量结合,强调“`a` 是一个指针”。在声明多个变量时,更清晰地表达每个变量的性质: ```c int *a, *b; // a 和 b 都是指向 int指针 ``` 在 C++ 中,由于支持引用类型和更复杂的类型系统,`int* a` 这种写法更为常见,尤其是在现代 C++ 的风格指南中,它有助于强调类型信息。例如: ```cpp int* ptr; // ptr 是一个指向 int指针 ``` 相比之下,`int *ptr` 在语义上完全等价,但更贴近 C 的风格。 ### 声明多个变量时的注意事项 当在同一行声明多个变量时,`int* a, b;` 和 `int *a, *b;` 的差异变得明显: - `int* a, b;`:`a` 是 `int*` 类型,而 `b` 是 `int` 类型。 - `int *a, *b;`:`a` 和 `b` 都是 `int*` 类型。 因此,在声明多个指针变量时,建议使用 `int *a, *b;` 的形式,以避免混淆。 ### 常量指针指针常量的对比 结合 `const` 的使用,指针声明的写法对语义有显著影响: - `const int *a`:`a` 是一个指向 `const int` 的指针,即不能通过 `a` 修改其指向的值,但可以改变 `a` 的指向。 - `int *const a`:`a` 是一个指向 `int` 的常量指针,即 `a` 的指向不能更改,但可以通过 `a` 修改其指向的值。 - `const int *const a`:`a` 是一个指向 `const int` 的常量指针,即既不能通过 `a` 修改值,也不能改变 `a` 的指向[^1]。 ### 示例代码 以下代码展示了不同写法的指针声明及其行为差异: ```c #include <stdio.h> int main() { int x = 10, y = 20; // 声明多个指针变量 int *a = &x, *b = &y; printf("a = %d, b = %d\n", *a, *b); // 常量指针 const int *c = &x; c = &y; // 允许修改指向 // *c = 30; // 错误:不能通过 c 修改值 // 指针常量 int *const d = &x; // d = &y; // 错误:不能修改指向 *d = 30; // 允许修改值 printf("x = %d\n", x); return 0; } ``` ### 相关问题 1. 如何区分 `const int *a` 和 `int *const a` 的语义? 2. 在声明多个指针变量时,为何 `int *a, *b;` 比 `int* a, b;` 更加清晰? 3. 为何在 C++ 中更倾向于使用 `int* a` 这种写法? 4. `int const *a` 和 `const int *a` 是否等价? 5. 在指针常量中,为何不能修改指针的指向?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值