int a,int *a,int**a,int (*a)[10] 和int *a[10] 的区别,数组引用

本文深入解析C++中int*a[10]与int(*a)[10]的区别,探讨指针与数组的关系,解释int**a与int(*a)[10]的差异,同时介绍数组引用的概念及应用。

首先说一下以下性质

a) int a;表示一个内存空间,这个空间用来存放一个整数(int);
b)  int* a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间;
c)  int** a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。也简单的说,指向了一个b)中提到的空间;                                                                                                              d) int (*a)[10];表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为10、类型为int的数组;和int** a的区别在于,++、+=1之后的结果不一样,其他用法基本相同。

一、int *a[10] 和 int(*a)[10] 的区别

int *a[10] :数组指针。数组a里存放的是10个int型指针                                                                                                                    int (*a)[10] :a是指针,指向一个数组。此数组有10个int型元素
int *a[10]
先找到声明符a,然后向右看,有[]说明a是个数组,再向左看,是int *,说明数组中的每个元素是int *。所以这是一个存放int指针的数组。
int(*a)[10]
先找到声明符a,被括号括着,先看括号内的(优先级高),然后向右看,没有,向左看,是*,说明s是个指针,什么指针?在看括号外面的,先向右看,有[] 是个数组,说明a是个志向数组的指针,再向左看,是int,说明数组的每个元素是int。所以,这是一个指向存放int的数组的指针。

 二、int **a 和 int(*a)[10]的区别

分析一下程序

int tt[10];

int (*a)[10] = &tt;    // 其实 a是二维指针  **a等于2, 但是不让这样赋值 int **a = &tt; 但让下面这样赋值。
int (*a)[10] = &tt; 类似于int *b = tt, int **a = &b; (因为不能直接这样赋值 int **a = &tt);  但是也不一样。
若 int (*a)[10] = &tt 这样赋值,**a等于2, *a输出 7339472,a也等于7339472。
若这样赋值  int *b = tt, int **a = &b; **a 等于2,*a 等于7339472,a等于 7339512,两者是有差异的。                                          但是两者这样赋值之后 int *k = *a; 都可以这样输出  printf("%d", *k); 所以我说类似,应该是 数组名的地址想要直接赋值给地址的话,应该只能 int (*a)[10] = &tt;(但是仔细想想,数组名不就是一个地址吗,数组名的地址不就是,地址的地址吗,也就是二维指针了,所以我说和**a类似)

#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;

int main()
{
	int tt[10];
	for(int i = 0;i<10;i++)
		tt[i] = i+2;	
	/*
	int *b = tt;
	int **a = &b; 
	int *k = *a;   // 二维指针变一维指针
	*/
	// 或者这样赋值 
		
	int (*a)[10] = &tt;
	int *k = *a;  // 二维指针变一维指针
	
	//printf("%d", **a);   **a这样输出结果为2  *a输出7339472 一个地址值。 
	for(int i = 0;i<10;i++)
	{
		if(i!=0) cout <<" " ; 	
		//printf("%d ", *(*a+i));  // 还可以这样输出
		printf("%d", *k);
		//a = a + 1; 
		k++;		
	}	
}

当这样赋值时,int (*a)[10] = &tt; 不管是 a++,还是a+=1,输出的 **a都是乱码(除第一次输出外,第一次输出2);

三  数组引用 

	(1)	数组引用,arrRef 相对于 arr 的别名 
	int arr[10];
	int (&arrRef)[10] = arr;
	(2) 指针数组引用, arry 相当于 ptrs 的别名,arry是一个含有10个int型指针数组的引用 
	int *ptrs[10]; 
	int *(&arry)[10] = ptrs;

 

在C/C++中,`const int *a` `int const *a` 没有区别,它们都表示一个**常量指针**(pointer to const),即指针指向的值是常量,不能通过该指针修改值,但指针本身可以指向其他地址[^1]。 例如: ```cpp int a = 10; int b = 20; const int *p = &a; p = &b; // 合法:指针可以重新指向其他变量 *p = 30; // 非法:不能通过该指针修改指向的值 ``` ### 常量指针与指针常量的区别 1. **常量指针(Pointer to const)** - 声明形式:`const int *p` 或 `int const *p` - 特点:指针指向的值不能被修改,但指针可以指向其他对象。 - 示例: ```cpp int x = 5, y = 10; const int *p = &x; p = &y; // 合法 *p = 20; // 非法[^4] ``` 2. **指针常量(Pointer const)** - 声明形式:`int *const p` - 特点:指针本身是常量,一旦初始化后不能指向其他对象,但可以通过指针修改指向的值[^3]。 - 示例: ```cpp int x = 5; int *const p = &x; *p = 10; // 合法 int y = 20; p = &y; // 非法[^3] ``` 3. **常量指针常量(const pointer to const)** - 声明形式:`const int *const p` 或 `int const *const p` - 特点:指针本身是常量,并且指向的值也不能被修改[^4]。 - 示例: ```cpp int x = 5; const int *const p = &x; *p = 10; // 非法 int y = 10; p = &y; // 非法[^4] ``` ### 总结记忆方法 可以采用“**从右往左读**”的方式理解指针声明[^2]: - `const int *p` → `*p` 是 `const int`,即通过指针访问的值是常量。 - `int *const p` → `p` 是 `const`,即指针本身是常量。 - `const int *const p` → `p` 是常量指针,且指向的值也是常量。 这种理解方式有助于快速判断 `const` 所修饰的对象。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值