//数组和指针
//数组和指针
int a[5] = { 2, 4, 8, 1, 9 };
int* p = a;
//a++; 不可以自增 可以 (a + 1)
printf("%p, %p\n", &*(p + 1), &a[1]);// &*(p + 1)和(p+1)一样
//下面这是合法的
*(p + 2) == *(2 + p) == 2[p];
//指针数组
int a = 1, b = 4, c = 3, d = 9, e = 0;
int* n[5] = { &a, &b, &c, &d, &e };
printf("%p\n", n[2]);//地址
printf("%d\n", *n[2]);//数值
int f = 10;
//修改n[2]的值
n[2] = &f; //修改了n[2]的元素值,把地址修改了。f的地址赋值给了n[2] 地址变了,数值也变了
//*n[2] = f; //地址没有变,修改了地址指向的数值。%d n[2] 为 10
printf("%p\n", n[2]);//地址
printf("%d\n", *n[2]);//数值
//拉链结构
int a[3] = { 1, 2, 3 };
int b[3] = { 8, 6, 7 };
int c[3] = { 12, 48, 35 };
int* n[3] = { a, b, c };
printf("%d\n", *(n[1] + 1));//n[1][1]
//数组指针
//数组指针
int a[5] = { 1, 2, 3, 4, 5 };
int (*p)[5] = &a;
printf("%d\n", (*p)[2]);//3
printf("%d\n", p[0][2]);//3
printf("%p, %p\n", &a[2], &(*p)[2]);
//二维数组和指针
//二维数组和指针
int n[2][3] = { { 1, 2, 3 }, { 88, 99, 22 } };
//指针指向二维数组元素
int *p = &n[1][1];
printf("%d\n", *p);
//指针指向二维数组中的一维数组
int (*p1)[3] = &n[0];
printf("%d\n", (*p1)[1]);
printf("%p,%p\n", &n[0][1],&(*p1)[1]);
//指针指向二维数组
int (*p3)[2][3] = &n;
//分解
//(*p3) == n;
(*p3)[1][1] = 100;//修改n[1][1]的值
printf("%d\n", (*p3)[1][1]);
//遍历
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("%d\t", (*p3)[i][j]);
}
printf("\n");
}