C语言数组名和指针的关系

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/knighkingLOL/article/details/102775320

案例:
int matrix[3][10];

matrix[1][5]


matrix: 指向包含10个整型元素的数组的指针, 指代第一行, 第一行是子数组

matrix+1: 指向包含10个整型元素的数组的指针+1表示第二行, 第二行是子数组

*(matrix+1): 对matrix+1进行间接访问操作, 选择第二行的子数组

*(matrix+1)+5: 这个指针比*(matrix+1)子数组上移动5个


*(*(matrix+1)+5) 和*(matrix[1]+5)相同, 对*(matrix+1)+5进行简介访问操作








-----------------------------------------------------------------------------------------


源码:


 1 #include<stdio.h>
  2 
  3 int main()
  4 {
  5         int a[4][4]=
  6         {
  7                 1, 2, 3, 4,
  8                 5, 6, 7 ,8,
  9                 9, 10, 11, 12,
 10                 13, 14, 15, 16
 11         };
 12         int (*ps)[4]=a;
 13 
 14 
 15         printf("\nps==%x\n", ps);
 16         printf("\nps+1==%x\n", ps+1);
 17         printf("\nps+2==%x\n", ps+2);
 18         printf("\nps+3==%x\n", ps+3);
 19 
 20 
 21         printf("\n(*ps)==%x\n", *ps);
 22         printf("\n(*ps+1)==%x\n", *ps+1);
 23 
 24         printf("\n*(ps)==%x\n", *(ps));
 25         printf("\n*(ps+1)==%x\n", *(ps+1));
 26         printf("\n*(ps+2)==%x\n", *(ps+2));
 27         printf("\n*(ps+3)==%x\n", *(ps+3));
 28 
 29 
 30         printf("\n**(ps+3)==%x\n", **(ps+3));
 31         printf("\nps[0][2]==%x\n", ps[0][2]);
 32         printf("\n*(ps+1)+3)==%x\n", *(ps+1)+3);
 33         printf("\n*(*(ps+1)+3)==%x\n", *(*(ps+1)+3));
 34         printf("\n*(ps+1))==%x\n", *(ps+1));
 35         printf("\n\n");
                                              

36 
 37 
 38         printf("\n(*ps)==%x\n", *ps);
 39         printf("\n(*ps)[0]==%x\n", (*ps)[0]);
 40         printf("\n(*ps)[2]==%x\n", (*ps)[2]);
 41 
 42         printf("\n(*ps)==%x\n", *ps);
 43         printf("\n(*ps+0)[0]==%x\n", (*ps)[0]);
 44         printf("\n(*ps+1)[2]==%x\n", (*ps)[2]);
 45 
 46         printf("\n(*ps)==%x\n", *ps);
 47         printf("\n(*(ps+1))[2]==%x\n", (*(ps+1))[2]);
 48         printf("\n(*(ps+2))[2]==%x\n", (*(ps+2))[2]);
 49 
 50 
 51 
 52 
 53         printf("\n(*ps)==%x\n", *ps);
 54 
 55         printf("\nps==%x\n", ps);
 56         printf("\n(ps+1)==%x\n", (ps+1));
 57 
 58         printf("\n(ps+1)[0]==%x\n", (ps+1)[0]);
 59         printf("\n((ps+1))[1]==%x\n", ((ps+1))[1]);
 60         printf("\n((ps+1))[2]==%x\n", ((ps+1))[2]);
 61 
 62 
 63         printf("\nps+2==%x\n", ps+2);
 64 
 65         printf("\nps+3==%x\n", ps+3);
 66 
 67 
 68 
 69 
 70 
 71         return 0;
 72 }


     
输出:



[email protected]:~/test/test/test_str/test_ch/pointer/6.18_1$ ./a.out

ps==a29dbda0

ps+1==a29dbdb0

ps+2==a29dbdc0

ps+3==a29dbdd0

(*ps)==a29dbda0

(*ps+1)==a29dbda4

*(ps)==a29dbda0

*(ps+1)==a29dbdb0

*(ps+2)==a29dbdc0

*(ps+3)==a29dbdd0

**(ps+3)==d

ps[0][2]==3

*(ps+1)+3)==a29dbdbc

*(*(ps+1)+3)==8

*(ps+1))==a29dbdb0



(*ps)==a29dbda0

(*ps)[0]==1

(*ps)[2]==3

(*ps)==a29dbda0

(*ps+0)[0]==1

(*ps+1)[2]==3

(*ps)==a29dbda0

(*(ps+1))[2]==7

(*(ps+2))[2]==b

(*ps)==a29dbda0

ps==a29dbda0

(ps+1)==a29dbdb0

(ps+1)[0]==a29dbdb0

((ps+1))[1]==a29dbdc0

((ps+1))[2]==a29dbdd0

ps+2==a29dbdc0

ps+3==a29dbdd0





-------------分割线---------------------------------
总结:
	二维数组中,
	**p是对元素的引用, 包括   *(*(p+1)+2)之类的
	*p和p的功能一样, 都是指向行首元素的指针, 保存行首元素的地址
	在(*p)[0]中, (*p)指向行首, 然后[0]是取行首地址之后的下标, 
	也是对二维数组元素的引用,	类似功能, (*(ps+1))[2]
				
	注意: ps+1为行首地址
	(ps+1)和(ps+1)[0]都是指向行首元素的指针
	(ps+1)[1]和ps+2 保存的地址一样的, 
	比如 (ps+1)[2]和ps+3 相等, 所以, 猜测ps加减移动指向行首将这个作为一维数组首地址,
	然后取这个[2]的元素(他是个行首地址), 所以和ps+3是一摸一样的
					
				














猜你喜欢

转载自blog.csdn.net/knighkingLOL/article/details/102775320