c语言指针与数组
- **一、指针与一维数组**
- 1.一维数组的存储方式
- 2. 对一维数组名的理解
- 3. 数组下标和指针的关系
- 4.一位数组名与取数组首地址的区别
- **二、指针与二维数组**
- 1.二维数组的存储方式
- 2.二维数组下标和指针的对应关系
- 例题:
怀着忐忑的心情写了人生第一篇博客......诚惶诚恐......
主要内容:本篇博客主要是较为详细的解释指针与一维、二维数组的联系
一、指针与一维数组
1.一维数组的存储方式
- 当我们定义了一个一维数组a时,编译器就会根据数组a的类型和元素个数分配一定的内存空间(该内存单元一定是连续的),并且这个内存单元一旦分配,便不会改变。
2. 对一维数组名的理解
- 单独的一维数组名是一个指针常量,存放的是一维数组第一个元素的地址。 例:int a[2];
对于数组a,如果我们单纯只是调用数组名a,它代表着数组首个元素即a[0]的地址。
3. 数组下标和指针的关系
- 对于数组a[i],它永远等价于*(a+i)。
4.一位数组名与取数组首地址的区别
int array[5] = {1,2,3,4,5};
printf("%d %d %d",array,,&array,&array[0]);
- 由上述代码的输出结果我们可以知道array、&array与&array[0]的值是一样的。但是其意义是完全不一样的。array和&array[0]是一样的,代表数组首元素的地址;而&array代表整个数组的首地址。
分开来看,array是一个地址,它也可以看作为array+0,而*(array+0)又是数组第一个元素的内容,也就 是array[0],所以array就是下表为0的元素的地址。
对于&array,它是变量array的地址,而变量array的偶用范围是四个int空间,如果我们将&array赋给某 个变量p,那么p的类型应该是:int (*)[4]; 也就是指向包含4个int数据的数组的指针。
之前看到过一个很通俗的例子:就像是陕西省政府在西安,而西安的市政府也在西安,两个政府都在线,其 代表的意义却完全不一样。
二、指针与二维数组
1.二维数组的存储方式
- 按照先后的顺序依次储存,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为数组元素,显然每个行的数 组元素都是一个一维数组。
2.二维数组下标和指针的对应关系
对于 int a[3] [3],数组名a是数组首元素的地址。
&a代表整个数组,+1直接跳到数组末,是a升一级。
a是行行指针,+1跳到下一行。
*a是第一个数的指针,+1跳到下一个数。对于二维数组每一行都对应一个行地址,二维数组的地址就是第一行地址。
行地址:
a:第一行地址。
a+1:第二行地址
a+2:第二行地址
列地址:
a[0]+0:第一列地址
a[0]+1:第二列地址
a[0]+2:第二列地址
例题:
#include <stdio.h>
int main (void)
{int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};int * pa[3] = { a[0] , a[1] , a[2] };int *p = a[0];int i;for( i=0; i<3; i++ ){printf(" %d %d %d",a[i][2-i],*a[i],*(*(a+i)+i)); printf("\n"); //*(*(a+i)+i),a+i//是矩阵a的第i行的地址,*(a+i)将被求第i行的第一个元素的地址。*(a+i)+i将被求值为第i行的第i//个元素的地址。*(*(a+i)+i)将被求值为第i行中的第i个元素的int整数值。}for( i=0; i<3; i++ ){printf("%d %d",*pa[i],p[i]);printf("\n");}return 0;
}
结果:
a[i][2-i] = 3 *a[i] = 1 *(*(a+i)+i) = 1
a[i][2-i] = 5 *a[i] = 4 *(*(a+i)+i) = 5
a[i][2-i] = 7 *a[i] = 7 *(*(a+i)+i) = 9
*pa[i] = 1 p[i] = 1
*pa[i] = 4 p[i] = 2
*pa[i] = 7 p[i] = 3