指针数组

不知道你是否用到了指针数组,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]形式的地方,他的声明一定是一个二维数组,

也有可是一面所说的各种情况.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值