对于数组和指针的理解

对于数组和指针,我觉得谭浩强老师的这部分讲得比较详细,他的书我觉得是是入门快的好书。

一、

对于一个int a[ 3 ] [ 4 ]的二维数组(INT是32位数据类型)

我们这样理解:1、a,a+1。。。都是行地址。(凡是不带*和【】为行地址)

                           2、*a,*(a+1)。。。都是列地址,等价于a[ 0 ],a[ 1 ],这都是第X行第一列的地址,*a:第一行第一列地址

                                 *(a+1)是第二行第一列的地址。(凡是带*和【】全都理解为列地址)

                          3、*(a+1)+2表示第二行第三列,与a[ 1 ][ 2 ]等价

                          4、对于行地址的计算a+1,1代表一行,一行数相差四个整型据,两行地址会相差16。

                               对于列地址计算*(a+1)+1,最后这个1代表列数,列列之间差一个字节,两列地址相差4。

                             小结:对于二维数组在内存中的存储为按行依次存储,可展开看成一个一维的数组。

                                       int *p=a[0],(int *p=a也可以),可以for(p=a[0];p<12;P++)printf(“%d”,*p);

                         举例:对a[ 1][2]的地址可表示为:

                                       *(a+1)+2;a[ 1 ]+2 ; &a[ 1 ] [ 2 ];&a[ 0 ] [ 0 ]+1*4+2;

                          5、对于int *p和 int (*p)[4] 的比较

                                       int *p = a[0]; 指向数组元素的指针变量。

                                    int (*p)[4] = a;指向m个元素组成的一维数组的指针变量。

                                     看红字可以知道,Int *p  ,可以指向任意一个元素

                                     而int (*p)[4]  ,p不能指向一维数组的中的第J个元素,只是一维数组的首地址。

                          讨论:初始化问题:   int *p=a【0】   ,p可以看成 展开一维数组的首地址(列地址),

                                     哪个元素就是*(P+i) 。int *p=a;效果一样。

                                 int  (*p)【4】=a;p就是行地址,对于每个元素*(*(P+i)+j)。

                              (*p)[4] = a【0】和int *p=a也可以,虽然a和a【0】值是相等的,定义的P是指针类型,默认四个字节,与初始化关系不大,只要地址一样即可。

         二、

                          指针的与数组不等价

               看了一点c专家编程,把感受整理一下。

               一般的数组,指针的形参和实参的变换可以。

              对于两个文件中,一个文件中定义数组int mango【100】,另一个文件引用他的话

              extern    int  *mango ,对吗?*mango表示这个数组的第一个值。   应该为extern int mango[    ];  这里不可

             替 换   。                                 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值