当前位置:   article > 正文

C语言 之 二维数组与指针数组的定义认识、二维数组地址认识,二维数组与指针数组配合使用

二维数组地址

目录

一、二维数组的地址认识

 1.代码演示

       运行结果:

2. 代码演示

       运行结果:

3.二维数组指针表现形式总结

 二、数组指针与二维数组

1.如何定义一个数组指针?

 代码演示:

数组指针注意事项

2.如何用数组指针访问二维数组的值?

代码演示:

运行结果:

3.数组指针和二维数组的配合使用

例题1:输入二维数组的行和列,找出对应二维数组行列的那个值。

代码演示:

运行结果:


一、二维数组的地址认识

访问二维数组值的示意图

 1.代码演示

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int arr[3][4] = {{1,3,5,7},{2,4,5,6},{11,22,33,44}};
  5. //三行四列的二维数组
  6. printf("arr是行的地址%p,偏移后行的地址是 %p \n",arr,arr+1);//二维数组偏移一个行地址,去介于列有多少个元素,这里是四列,类型为int型,所以行偏移16个字节大小。
  7. printf("arr[0]是列数组地址 %p ,偏移后地址是 %p \n",arr[0],arr[0]+1);
  8. printf("arr[0]是列数组地址 %p ,偏移后地址是 %p \n",*(arr+0),*(arr+0)+1);
  9. printf("arr[0]是列数组值 %d ,偏移后值是 %d \n", *(*(arr+0)) , *(*(arr+0)+1) );
  10. return 0;
  11. }

运行结果:

  1. arr是父亲地址000000000061FDF0,偏移后地址是 000000000061FE00
  2. arr[0]是子数组地址 000000000061FDF0 ,偏移后地址是 000000000061FDF4
  3. arr[0]是子数组地址 000000000061FDF0 ,偏移后地址是 000000000061FDF4
  4. arr[0]是子数组值 1 ,偏移后值是 3

2. 代码演示

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int arr[3][4] = {{1,3,5,7},{2,4,5,6},{11,22,33,44}};
  5. int i,j;
  6. for(i=0;i<3;i++){
  7. for(j=0;j<4;j++){
  8. printf("地址是%p,值是%d\n",&arr[i][j],arr[i][j]);
  9. printf("地址是%p,值是%d\n",arr[i]+j,*(arr[i]+j)); //arr[i]+j 二维数组在这里arr[i]是数组名字
  10. printf("地址是%p,值是%d\n",*(arr+i)+j,*(*(arr+i)+j));
  11. putchar('\n');
  12. }
  13. putchar('\n');
  14. }
  15. return 0;
  16. }
运行结果:
  1. 地址是000000000061FDE0,值是1
  2. 地址是000000000061FDE0,值是1
  3. 地址是000000000061FDE0,值是1
  4. 地址是000000000061FDE4,值是3
  5. 地址是000000000061FDE4,值是3
  6. 地址是000000000061FDE4,值是3
  7. 地址是000000000061FDE8,值是5
  8. 地址是000000000061FDE8,值是5
  9. 地址是000000000061FDE8,值是5
  10. 地址是000000000061FDEC,值是7
  11. 地址是000000000061FDEC,值是7
  12. 地址是000000000061FDEC,值是7
  13. 地址是000000000061FDF0,值是2
  14. 地址是000000000061FDF0,值是2
  15. 地址是000000000061FDF0,值是2
  16. 地址是000000000061FDF4,值是4
  17. 地址是000000000061FDF4,值是4
  18. 地址是000000000061FDF4,值是4
  19. 地址是000000000061FDF8,值是5
  20. 地址是000000000061FDF8,值是5
  21. 地址是000000000061FDF8,值是5
  22. 地址是000000000061FDFC,值是6
  23. 地址是000000000061FDFC,值是6
  24. 地址是000000000061FDFC,值是6
  25. 地址是000000000061FE00,值是11
  26. 地址是000000000061FE00,值是11
  27. 地址是000000000061FE00,值是11
  28. 地址是000000000061FE04,值是22
  29. 地址是000000000061FE04,值是22
  30. 地址是000000000061FE04,值是22
  31. 地址是000000000061FE08,值是33
  32. 地址是000000000061FE08,值是33
  33. 地址是000000000061FE08,值是33
  34. 地址是000000000061FE0C,值是44
  35. 地址是000000000061FE0C,值是44
  36. 地址是000000000061FE0C,值是44

3.二维数组指针表现形式总结

 二、数组指针与二维数组

能不能定义一个指针,让指针偏移的时候,也偏移对应大小的数组?

1.如何定义一个数组指针?

 代码演示:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int arr[3][4] = {{1,3,5,7},{2,4,6,8},{11,22,33,44}};
  5. int i,j;
  6. int (*p)[4]; //数组指针的定义
  7. p = arr; //将数组指针指向二维数组
  8. //数组指针才是真正等同于二位数组
  9. //有多少列数组就要定义多少列的数组指针,这里是arr是三行四列,所以int (*p)[4];
  10. return 0
  11. }

数组指针注意事项

1. 有多少列数组就要定义多少列的数组指针,这里是arr是三行四列,所以定义一个数组指针是            int (*p)[4];

2.数组指针 int (*p)[4]; 数组指针p++ 的偏移量是整行 ,一行有四个int型一个int型是4字节,所以这里偏移量是16字节

2.如何用数组指针访问二维数组的值?

代码演示:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int arr[3][4] = {{1,3,5,7},{2,4,6,8},{11,22,33,44}};
  5. int i,j;
  6. int (*p)[4];
  7. p = arr;
  8. printf("p = %p\n",p);
  9. printf("++p = %p\n",++p); //数组指针 int (*p)[4]; p++ 的偏移量是整行 ,这里偏移量是16字节
  10. p = arr;
  11. for(i=0;i<3;i++){
  12. for(j=0;j<4;j++){
  13. printf("arr %d ",*(*(p+i)+j)); //用数组指针访问二维数组的第一种方式
  14. }
  15. putchar('\n');
  16. }
  17. putchar('\n');
  18. p = arr;
  19. for(i=0;i<3;i++){
  20. for(j=0;j<4;j++){
  21. printf("arr %d ",p[i][j]); //用数组指针访问二维数组的第二种方式
  22. }
  23. putchar('\n');
  24. }
  25. return 0;
  26. }
运行结果:
  1. p = 000000000061FDE0
  2. ++p = 000000000061FDF0 //++p后指针数组的偏移量是16个字节,++p是偏移数组的整行
  3. arr 1 arr 3 arr 5 arr 7 //数组指针访问二维数组的第一种方式
  4. arr 2 arr 4 arr 6 arr 8
  5. arr 11 arr 22 arr 33 arr 44
  6. arr 1 arr 3 arr 5 arr 7 //数组指针访问二维数组的第二种方式
  7. arr 2 arr 4 arr 6 arr 8
  8. arr 11 arr 22 arr 33 arr 44

3.数组指针和二维数组的配合使用

例题1:输入二维数组的行和列,找出对应二维数组行列的那个值。

代码演示:
  1. #include<stdio.h>
  2. void tipsInputHangLie(int *hang,int *lie) //提示用户输入行列的值
  3. {
  4. puts("请输入行的值");
  5. scanf("%d",hang);
  6. puts("请输入列的值");
  7. scanf("%d",lie);
  8. }
  9. int getTheData(int (*p)[4], int hang, int lie) //找出对应行列值的那个数
  10. {
  11. /*
  12. int a;
  13. a = *(*(p+hang)+lie);
  14. return a;
  15. */
  16. return p[hang][lie];
  17. }
  18. int main()
  19. {
  20. int arr[3][4] = {{1,3,5,7},{2,4,6,8},{11,22,33,44}};
  21. int hang,lie;
  22. int data;
  23. tipsInputHangLie(&hang,&lie);
  24. data = getTheData(arr,hang,lie);
  25. printf("行%d 列%d 的值是%d",hang,lie,data); //打印出找到的结果
  26. return 0;
  27. }
  28. //6.17数组指针
运行结果:
  1. 请输入行的值
  2. 2
  3. 请输入列的值
  4. 2
  5. 22 的值是33

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/223621
推荐阅读
相关标签
  

闽ICP备14008679号