对于数组和指针,我觉得谭浩强老师的这部分讲得比较详细,他的书我觉得是是入门快的好书。
一、
对于一个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[ ]; 这里不可
替 换 。