c语言指针和数组的联系

怀着忐忑的心情写了人生第一篇博客......诚惶诚恐......

主要内容:本篇博客主要是较为详细的解释指针与一维、二维数组的联系

一、指针与一维数组


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
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值