C语言 二维数组和指针

C语言 二维数组和指针二维数组可以看成是元素为一维数组的数组 假设有一个三行四列的二维数组 a 它定义为 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 a 是二维数组名 a 数组包含 3 行 即 3 个行元素 a 0 a 1 a 2 每个行元素都可以看成含有 4 个元素的一维数组 而且 C 语言规定 a 0 a 1 a 2 分别是这三个一

二维数组可以看成是元素为一维数组的数组,假设有一个三行四列的二维数组a,它定义为:

int a[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };

  • a[0] 表示的就是元素 a[0][0] 的地址,即 a[0]==&a[0][0];
  • a[1] 表示的就是元素 a[1][0] 的地址,即 a[1]==&a[1][0];
  • a[2] 表示的就是元素 a[2][0] 的地址,即 a[2]==&a[2][0]。

所以二维数组a[M][N]中,a[i]表示的就是元素a[i][0]的地址

a[i] == &a[i][0]

a[0]、a[1]、a[2]、…、a[M–1] 分别表示二维数组 a[M][N] 第 0 行、第 1 行、第 2 行、…、第 M–1 行各一维数组的首地址,那么同样的道理,

  • a[0]+1 就表示元素 a[0][1] 的地址,
  • a[0]+2 就表示元素 a[0][2] 的地址,
  • a[1]+1 就表示元素 a[1][1] 的地址,
  • a[1]+2 就表示元素 a[1][2] 的地址
  • a[i]+j 就表示 a[i][j] 的地址

*(a+i)+j == &a[i][j]

二维数组的首地址和数组名

二维数组名 a 是地址的地址,必须两次取值才可以取出数组中存储的数据。对于二维数组 a[M][N],数组名 a 的类型为 int(*)[N],所以如果定义了一个指针变量 p:int *p;

希望这个指针变量指向二维数组 a,那么不能把 a 赋给 p,因为它们的类型不一样。要么把 &a[0][0] 赋给 p,要么把 a[0] 赋给 p,要么把 *a 赋给 p。前两个好理解,可为什么可以把 *a 赋给 p?因为 a==&(&a[0][0]),所以 a==(&(&a[0][0]))==&a[0][0]。

除此之外你也可以把指针变量 p 定义成 int(*)[N] 型,这时就可以把 a 赋给 p,而且用这种方法的人还比较多,但我不喜欢,因为我觉得这样定义看起来很别扭。

# include  
     int main(void) { 
    int a[3][4] = { 
   1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int i, j; int (*p)[4] = a; //记住这种定义格式 for (i=0; i<3; ++i) { 
    for (j=0; j<4; ++j) { 
    printf("%-2d\x20", *(*(p+i)+j)); /*%-2d中, '-'表示左对齐, 如果不写'-'则默认表示右对齐;2表示这个元素输出时占两个空格的空间*/ } printf("\n"); } return 0; } 
# include  
     int main(void) { 
    int a[3][4] = { 
   1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int i, j; for (i=0; i<3; ++i) { 
    for (j=0; j<4; ++j) { 
    printf("%#X\x20", &a[i][j]); } printf("\n"); } return 0; } 

我们看到地址都是连续的。所以对于数组 a[3][4],如果把 &a[0][0] 赋给指针变量 p 的话,那么:

# include  
     int main(void) { 
    int a[3][4] = { 
   1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int i, j; int *p = &a[0][0]; //把a[0][0]的地址赋给指针变量p for (i=0; i<3; ++i) { 
    for (j=0; j<4; ++j) { 
    printf("%-2d\x20", *(p+i*4+j)); } printf("\n"); } return 0; } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/225936.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午8:12
下一篇 2026年3月17日 上午8:12


相关推荐

  • php数据库根据手机号获取归属地,PHP通过API获取手机号码归属地

    php数据库根据手机号获取归属地,PHP通过API获取手机号码归属地该API接口自2011年SAE平台上线稳定运行至今,增加了17号段的支持,欢迎各种采集注限制,并发10详细使用说明接口地址:http://appyun.sinaapp.com/index.php?app=mobile&controller=index&action=api请求方法:GET请求参数:参数名类型必填参数位置描述默认值appstring是urlPar…

    2022年7月22日
    16
  • 多元函数求极值,万能函数——fmincon讲解

    多元函数求极值,万能函数——fmincon讲解    matlab中的函数fmincon可用于求可以求取多元函数的极值,其约束包括五种:1、线性不等式约束;2、线性等式约束;3、变量约束;4、非线性不等式约束;5、非线性等式约束。其形式如下:x=fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)求解问题的标准型为minF(X)s.tAX&lt;=b(线性不等式约束)AeqX=beq(线性等式…

    2022年5月3日
    104
  • shell编程入门_unix编程

    shell编程入门_unix编程1.Shell的概念shell是一个命令行解释器,它为客户提供了一个Linux内核发送请求一边运行程序界面系统级程序,用汉语可以通过shell启动、挂起、停止甚至编写一些程序。shell还是一个功能强大的编程语言,易于编辑,易于调试,灵活性强,shell是结识知识性的脚本语言,在我们shell中直接调用Linux的系统命令操作即可。2.Shell的分类(1)BourneShell(bshell)从1979年在unix系统就开始使用了。它的主要…

    2025年6月19日
    3
  • macOS安装Cursor教程

    macOS安装Cursor教程

    2026年3月16日
    2
  • Android Application Thread CPU GC Operatiing and OOM Question 0603-随手笔记

    Android Application Thread CPU GC Operatiing and OOM Question 0603-随手笔记

    2022年1月13日
    53
  • Python中的单引号和双引号是否存在区别

    Python中的单引号和双引号是否存在区别在使用 Python 的过程中 一直在记着 input 中使用单引号 print 中使用双引号 还经常搞混 但今天在 print 中无意间搞错发现结果竟然是一致的 其中自定义的 alpha beta gamma 为三角形的三个角 运行后的输出结果显示一致 然后在网上搜到下面的结果 解释的不错 在此分享给大家 原文链接地址 https blog csdn net kevindree artic

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号