指针与二维数组

指针与一维数组

*************************************************************************************

 

    

 

数组名称可以参加所有指针相关运算!

int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, *p = &a[0];

如前所述:数组名称是该数组首地址常量,即,数组名称是该数组首元素首地址常量;即,a这个指针常量的值,就是a[0]的首地址!

即,a指向a[0];即,a的指类就是a[0]的类型,就是int;即,a的类型实际上是int *!

既然a指向a[0],那么:

*a = 10;应该念做:将10赋值给a所指向的空间;等价于:a[0] = 10;

*a <=> a[0]

既然a是首地址,即,a是指针,则:

a+1指向a[1];

*(a+1)<=>  a[1]

同理:

a+2指向a[2];

*(a+2)<=>  a[2]

若int i;且i的取值在有效下标范围内,则:

a+i指向a[i];

*(a+i)<=> a[i]

*(a+i) <=>  a[i]

*************************************************************************************

*************************************************************************************

 

指针与二维数组

*************************************************************************************

 

     

 

**************************************************************************************

*************************************************************************************

指针数组和数组指针的区别:https://blog.csdn.net/weixin_42072280/article/details/83210655

 

a指向第一行   a+1跳一行   a+i跳i行

*(a+i)进行降阶 指针从二阶值变为一阶值

*(a+i) + j  跳j列

*(*(a+i) + j)  取出其值

 

                                  a[0]+1

a         a[0][0]  a[0][1]  a[0][2]  a[0][3] 
a+1    a[1][0]  a[1][1]  a[1][2]  a[1][3]  
a+2     a[2][0]  a[2][1]  a[2][2]  a[2][3]  

 

动态二维数组由于必须要确定每一行列的个数,才能达到跳跃一行,而一旦确定下来了,就不是动态的了,于是只能用一维数组来模拟

二位数组如果里面的行列数不定的话,形成的指针加1无法进行整行跳跃,不能形成二维数组,如果把列写死了,就不能实现动态了

 

如果把数组名称当成参数来传递实参,他的形参一定是行指针变量

#include<stdio.h>
#include<malloc.h>

/*
typedef struct MATRIX{
	USER_TYPE *matrix;
	int rowCount;
	int colCount;
}MATRIX;

int setMatrixAt(MATRIX head, int row, int col, USER_TYPE data);

int setMatrixAt(MATRIX head, int row, int col, USER_TYPE data){
	head.matrix[row * head.colCount + col] = data;
}
*/
/*
void showMatrix(int *matrix, int rowCount, int colCount);

void showMatrix(int *matrix, int rowCount, int colCount){
	int i;
	int j;

	for(i = 0; i < rowCount; i++){
		for(j = 0; j < colCount; j++){
			printf("%d ", matrix[i * colCount + j]);
		}
		printf("\n");
	}
}
*/
void showMatrix(int (*)[4], int rowCount, int colCount);
void showArray(int b[10], int count);

void showArray(int *b, int count){
	printf("%d\n", sizeof(b));
}

void showMatrix(int (*m)[4], int rowCount, int colCount){
	int i;
	int j;

	printf("%d\n", sizeof(m));   //8   是一个指针 
	printf("%d\n", sizeof(m) / sizeof(int));  //想通过这种方式来确定数组个数是不可以的 

	for(i = 0; i < rowCount; i++){
		for(j = 0; j < colCount; j++){
			printf("%2d ", m[i][j]);
		}
		printf("\n");
	}
}

int main(){
	int a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
	int b[10];

	showArray(b, 10);
	showMatrix(a, 3, 4);
/*
	for(i = 0; i < 12; i++)
		printf("%d ", a[0][i]);
	showMatrix(&a[0][0], 3, 4);
/*	int a[6][4];
	int b[5][3][4];
	MATRIX matrix = {0};

	printf("%p %p\n", a, a+1);
	printf("%p %p\n", a[0], a[0]+1);
	printf("%p %p\n", &a, &a+1);
	printf("%p %p\n", b, b+1);
	// 能否定义一个动态二维数组?
	matrix.matrix = (USER_TYPE *)malloc(sizeof(USER_TYPE) * matrix.rowCount * matrix.colCount);
*/
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安安csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值