指针与一维数组*************************************************************************************
数组名称可以参加所有指针相关运算! 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]
动态二维数组由于必须要确定每一行列的个数,才能达到跳跃一行,而一旦确定下来了,就不是动态的了,于是只能用一维数组来模拟 二位数组如果里面的行列数不定的话,形成的指针加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);
*/
}