/*
数组指针:首先是个指针,指向数组的指针,eg: int(*p)[10],p指向偶10个元素的int型数组(int(*)[10]p);
指针数组:首先是个数组,存储指针的数组,eg: int* p[10],p是数组名,存储的是10个 int型指针。
一维数组:一位数组名相当于一个指针,存放的是第0个元素首地址。
二维数组:二位数组名存放的是第0行的首地址,不是第0行第0列的地址。二维数组是以行主序来存储内存的,是一个特殊的一维数组,这个一维数组的元素是二位数组的一行,也就是二位数组是一个整体。所以二维数组在进行参数传递的时候,要么传行指针,要么传指针的指针比如main函数:
(1) int main(int argc, char** argv)
(2) int main(int argc, char* argv[])
--> 取值:*(*(argv + m) + n)
*(argv + m) : 取m行地址
*(argv + m) + n : m行n列的地址
*/
int main(int argc, char* argv[])
{
int a = 100;
int * b = &a;
int d[10];
int c[10];
int e[10];
int data[4][5] = {0};
int i = 0, j = 0;
int* tmp[10] = {NULL};//指针数组
int(*p)[10] = NULL;//数组指针
int(*d_p)[5] = NULL;//数组指针
for(i = 0; i < 4; i++)
for(j = 0; j < 5; j++){
data[i][j] = 5;
}
for(i = 0; i < 10; i++){
d[i] = 1;
c[i] = 2;
e[i] = 3;
}
tmp[0] = d;
tmp[1] = c;
tmp[2] = e;
p = (int(*)[10])d;
d_p = data;
for(i = 0; i< 4;i++)
for(j = 0; j < 5; j++){
printf("d[%d][%d] = %d\n", i, j, *(*(d_p + i) + j) );
}
for (i = 0; i < 10; i++)
{
printf("d[%d] = %d\n", i, *(*(p + 0) + i));
printf("d[%d] = %d\n", i, *(tmp[0] + i));
printf("c[%d] = %d\n", i, *(tmp[1] + i));
printf("e[%d] = %d\n", i, *(tmp[2] + i));
}
printf("a addr = %p, b addr = %p, it is the same\n", &a, b);
return 0;
}