对二维数组的一些思考

首先,看下面一个简单的程序

#include <stdio.h> 
#define FORMAT "%d\n" 
int main(int argc, char *argv[]){ 
	int str[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 
	printf(FORMAT,*(*(str))); 
	return 0; 
}

 输出结果: 1

 解释:   二维数组名 str 是指向 的,指向以为数组str[0],即0行首地址

           *str 是指向 的,代表0行0列元素地址,等同于str[0]

            加* 指针变 指针

            加& 指针变 指针

 

接着,我们引入指针变量p

#include <stdio.h> 
#define FORMAT "%d\n" 
int main(int argc, char *argv[]){ 
	int str[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 
	int (*p)[3];
	p=str;
	printf(FORMAT,*(*(p))); 
	return 0; 
}

输出结果: 和上面一样 还是1 

把二维数组的首地址(即0行地址  行地址)赋给指针变量P

 

 好吧,我们要注意的问题要出现了

//程序1
#include <stdio.h>
#define FORMAT "%d\n" 
int main(int argc, char *argv[]){ 
 	int str[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 
 	int (*p)[3]; 
	p=str; 
 	printf(FORMAT,*(*p+4)); 
 	return 0; 
 }

 
//程序2
#include <stdio.h>
#define FORMAT "%d\n" 
int main(int argc, char *argv[]){ 
 	int str[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 
 	int (*p)[3]; 
	p=str; 
 	printf(FORMAT,*(*(p+1)+1)); 
 	return 0; 
 }
  
 //程序3
#include <stdio.h>
#define FORMAT "%d\n" 
int main(int argc, char *argv[]){ 
 	int str[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 
 	printf(FORMAT,str[1][1]); 
 	return 0; 
 }

 程序1、 2、3 运行的结果都是 5 

  注意 :比较程序1、2的第8行程序,程序1是用的(序号为4的数字,序号从0开始)输出二维数组的数字,而程序2用的是(即第1行第1列,行列的序号都是从0开始,切记!!!) ;

             程序3是最直接的输出方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值