#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define M 4
#define N 5
int main()
{
int m = 4, n = 5;
char arr[4][5] = {
{'A','B','C','D','E'},
{'F','G','H','I','J'},
{'K','L','M','N','O'},
{'P','Q','R','S','\0'}
};
char (*a)[N]; // a:指针
a = arr;
printf("%d\n", sizeof(a)); // 4 ----> 计算指针空间
printf("%d\n", sizeof(a+1)); // 4 ----> 计算指针空间
printf("%d\n", sizeof(*(a+1))); // 5 ----> 计算数组空间
printf("%s\n", a+1); // FGHIJKLMNOPQRS
printf("%s\n", *(a+1) + 3); // IJKLMNOPQRS
printf("%c\n", *(*(a+1) + 3)); // I
/*-------------------------------------------------------------------------
数 组 指 针 操 作 示 意 图
*p *p+3
|| ||
\/ \/
p -----> A B C D E
*(p+1) *(p+1)+3
|| ||
\/ \/
p+1 -----> F G H I J
K L M N O
P Q R S T
--------------------------------------------------------------------------------------------------------------*/
char * b[N]; // b:数组
for(int i = 0; i < m; i++)
b[i] = arr[i];
printf("%d\n", sizeof(b[0])); // 4 ----> 计算指针空间
printf("%d\n", sizeof(*(b[0]))); // 1 ----> 计算字符空间
printf("%s\n", b[1]); // FGHIJKLMNOPQRS
printf("%s\n", b[1] + 3); // IJKLMNOPQRS
printf("%c\n", *(b[1] + 3)); // I
/*-------------------------------------------------------------------------
指 针 数 组 操 作 示 意 图
p[0] p[0]+3
|| ||
\/ \/
A B C D E
p[1] p[1]+3
|| ||
\/ \/
F G H I J
K L M N O
P Q R S T
--------------------------------------------------------------------------------------------------------------*/
char arr2[6] = {'A', 'B', 'C', 'D', 'E', '\0'};
char *c = arr2;
printf("%s\n", c); // ABCDE
printf("%s\n", c + 3); // DE
printf("%c\n", *c); // A
printf("%c\n", c[3]); // D
printf("%c\n", *(c+3)); // D
/*-------------------------------------------------------------------------
普 通 指 针 操 作 示 意 图
*c *(c+3)
|| ||
\/ \/
(c)-----> A B C (c+3)-----> D E
--------------------------------------------------------------------------------------------------------------*/
return 0;
}