一维数组访问方式
一维数组中 a[i] 中的 a 代表了本数组的首地址,相当于 &a[0]。因此 *a 就等于 a[0]。那么对 a 加 1,就可以访问下一位:*(a+1) 就等于 a[1]。
访问一维数组首地址:a = &a[0];
访问一维数组的元素:a[i] = *(a+i);
输出一维数组:puts(a); //a为字符串首地址
二维数组访问方式
假设有 a[2][2] 这样一个二维数组,可以这么理解它:a 由 a[0],a[1],a[2] 构成,而 a[0] 又由 a[0][0],a[0][1],a[0][2] 构成,a[1] 由 a[1][0],a[1][1],a[1][2] 构成,a[2] 由 a[2][0],a[2][1],a[2][2] 构成。
1. a 由 a[0],a[1],a[2] 构成,而 a[0] 又由 a[0][1],a[0][1],a[0][2] 构成;
两个一维数组构成了一个二维数组。a 是一个二维数组,a[i] 是一个一维数组。既然 a[i] 是一个数组,那么数组名就是这个数组的首地址。比如,a[0] 就等同于 &a[0][0]。
2. a 是一个数组名,它有三个元素:a[0],a[1],a[2];* a 等于 a[0],*(a + 1) 等于 a[1],*( a + 2 )等于 a[2];a[0], a[1], a[2] 又都是各个一维数组的首地址。比如 a[0] 就等同于 &a[0][0],就是说 *a[0] = a[0][0]。
再结合上面的 *a 等于 a[0],可以得出:**a 等于 a[0][0]。
以a[2][2]为例,则指针与数组的等价关系为:
3. 简单记之,二维数组 a[i][j] 中的 a[i] 是一个一维数组名,也就是一个地址量。
访问二维数组的各个字符串首地址:a[i] = &a[i][0] = *(a+i)
访问二维数组的各个元素:a[i][j] = *(a[i] + j) = *(*(a+i)+j)
输出二维数组中的一个字符串:puts(a[i]); //a[i]为字符串的首地址
访问字符串数组
通常对字符串的处理,传入的的参数都是字符串的首地址,也就是字符串名。
比如:
char s[80]; // 定义一个长度为 80 的字符串 s
char t[80]; // 定义一个长度为 80 的字符串 t
gets (s); // 读入一个字符串
puts (s); // 输出一个字符串
strcpy (s, t); // 将字符串 t 拷贝到 字符串 s 中
其中的 s 都是该字符串的首地址。
那相对于二维数组而言,
char *s[] = "I", "love", "you"};
//输出"love"
puts (s[1]); //字符串形式 - s[1]是一个地址量,代表"love",为"love"字串的首地址
puts (*(s+1)); //指针形式
参考博客: