二维数组指针_地址和值的表达方式_区别 如 &a[0],*a[0], *(a+i),*(a+i)+j 等

强调:

  • 二维数组名(如a)是指向的。因此a+1中的“1”代表一行中全部元素所占的字节数。
  • 一维数组名(如a[0],a[1])是指向列元素的。a[0]+1 中的“1”代表一个 a 元素所占的字节数。

1.在指向的指针前面加一个 * ,就转换为指向列的指针

  • 例如,a 和 a+1 是指向行的指针,在它们前面加一个 * ,变成 *a, *(a+1), 它们就成为指向列的指针,分别指向a数组0行0列的元素和1行0列的元素。

2.在指向的指针前面加 &,就转换为指向行的指针

  • 例如,a[0]是指向0行0列元素的指针,在它前面加一个&,得 &a[0] ,由于 a[0] 与 *(a+0) 等价,因此 &a[0] 与 &*a 等价,也就是与 a 等价,它指向二维数组的0行。

注意:

不要把 &a[i] 简单地理解为 a[i] 元素的物理地址,因为并不存在 a[i] 这样一个实际的数据存储单元。它只是一种地址的计算方法,能得到第 i 行的首地址,&a[i] 和 a[i] 的值是一样的,但它们的含义是不同的。
&a[i] 或 a+i 指向行,而 a[i] 或 *(a+i) 指向列。
当下标 j = 0 时,&a[i] 和 a[i] (即 a[i]+j ) 值相等,即它们代表同一地址,但应注意它们所指向的对象是不同的,即指针的基类型是不同的。

*(a+i) 只是a[i]的另一种表示形式,不要简单地认为 *(a+i) 是“ a+i 所指单元中的内容 ”。
在一维数组中 a+i 所指的是一个数组元素的存储单元,在该单元中有具体值,上述说法是正确的。
而对二维数组,a+i 不是指向具体存储单元而是指向行。
在二维数组中,a+i,a[i],*(a+i),&a[i],&a[i][0]的值相等,即它们都代表同一地址。

#include<stdio.h>
int main()
{
    
    
	int a[3][4]={
    
    1,3,5,7,9,11,13,15,17,19,21,23};
/*	
	printf("%d,%d\n",a,*a); // 0行首地址 和 0行0列元素地址     (注释掉的这部分可不看,和下边是一样的)
	
	printf("%d,%d\n",a[0],*(a+0)); // 0行0列元素地址 
	printf("%d,%d\n",&a[0],&a[0][0]); // 0行首地址 和 0行0列元素地址 
	
	printf("%d,%d\n",a[1],a+1); // 1行0列元素地址 和 1行首地址 
	printf("%d,%d\n",&a[1][0],*(a+1)+0); // 1行0列元素地址
	 
	printf("%d,%d\n",a[2],*(a+2)); // 2行0列元素地址 
	printf("%d,%d\n",&a[2],a+2); // 2行首地址
	 
	printf("%d,%d\n",a[1][0],*(*(a+1)+0)); // 1行0列元素的值 
	printf("%d,%d\n",*a[2],*(*(a+2)+0));  // 2行0列元素的值 
*/	
	printf("%d %d %d %d %d\n",*a,a[0],&a[0][0],*(a+0),*(a+0)+0);  // 0行0列元素地址 
	printf("%d %d %d %d\n",a[1],&a[1][0],*(a+1),*(a+1)+0);        // 1行0列元素地址 
	printf("%d %d %d %d\n",a[2],&a[2][0],*(a+2),*(a+2)+0);        // 2行0列元素地址 
	
	printf("%d %d\n",a,&a[0]);   // 0行首地址 
	printf("%d %d\n",a+1,&a[1]); // 1行首地址 
	printf("%d %d\n",a+2,&a[2]); // 2行首地址 
	
	printf("%d %d %d\n",*a[1],a[1][0],*(*(a+1)+0)); // 1行0列元素的值 
	printf("%d %d %d\n",*a[2],a[2][0],*(*(a+2)+0)); // 2行0列元素的值 
	
	return 0;
 }

–源自谭浩强C语言课本eg.8.11,仅作笔记

猜你喜欢

转载自blog.csdn.net/xiaoyue_/article/details/115086865