不知道你是否用到了指针数组,C语言中使用指针数组是一种常用的编程技巧
/*=====================================
本程序是为了学习而使用的的测试程序,用来
说明C语言中的一些学习误区,对C语言的某些
知识作详细的讲解
=======================================*/
#include <stdio.h>
#include <stdlib.h>
void fun1(char **m)
{
printf("第1个测试的值为:%c/n",m[2][3]);
}
void fun2(char (*m)[10])
{
printf("第2个测试的值为:%c/n",m[2][2]);
}
void main()
{
/*===========================================================
主题:指针数组(也叫Iliffe向量,display向量,是一种强大的编程技巧)
内容:
1.你在程序中看到一个array[i][j]时,你不知道它的声明形式,它可是以
下任何一种形式
int array[4][5] ;int型的二维数组
int *array[4] ; 4个int型的Iliffe向量
int **array ; int型的指针的指针
int (*array)[5]; int型的大小为5的数组的指针
因为作为左值的数组名都被译成指针,所以以上所有的原型都正确
(array[i][j]被解释为*(*(array+i)+j)
2.指针数组的用途:(存贮各行长度不一的表;传递一个字符串数组)
锯齿形字符串数组:
声明一个字符串数组并根据需要分配内存,这样可以大大节省空间
3.以下是函数调用中实参和形参的对应关系
实参 匹配的形参
数组的数组 char a[4][5]; char(*c)[5] ;数组的指针
指针数组 char *a[5]; char **c; 指针的指针
数组指针(行指针) char (*c)[5]; char (*c)[5];
指针的指针 Char **c; char **c;
注:实参到形参的转换规则,如果实参是数组,则形参是指向数组第一个元素的指针,实参不是数组,保证实参和形参类型一致就可以
比如:
1.数组的数组 char a[4][5]; 它的第一个元素是a[0],元素的类型是 char [5] (typedef array char [5] 则char [4][5]为 array[4]) ,指向这个类型的指针形式为 char (*)[5](即 array *).即形参形式。
2.指针数组 char *a[5]; 它的第一个元素是a[0],元素类型为char *,指向这个类型的指针形式为:char* *,所以形参为char **.
3.数组指针(行指针) char (*c)[5]; 因为它本质上不是一个数组,而是一个指针,只不过这个指针指向一个数组。所以形参和实参一样。
(上面暗示着在特定的上下文中数组将改写成指针)
============================================================*/
/*1.验证上面第三条所说的对应关系*/
char *p[10] = {"father",
"mother",
"brother",
"sister"};
fun1(p);
char **q = p;
fun1(q); //实际验证中,发现形参可以是'char **c'和'char *c[k](k为任何值)'两种形式
char str[4][10] = {"father","mother","brother","sister"};
fun2(str);
char (*str1)[10] = str; //第二维对应相等
fun2(str1); //执行这个调用时,形参必需是'char (*c)[5]'这个形式,第二维维数不能改
}
程序运行结果为:
第1个测试的值为:t
第1个测试的值为:t
第2个测试的值为:o
第2个测试的值为:o
注:主题中所说的第一条是是要注意的,不要以为使用array[i][j]形式的地方,他的声明一定是一个二维数组,
也有可是一面所说的各种情况.