当前位置:编程学习 > C/C++ >>

C语言提问(10)

void   transpose(int(*a)【5】);

void   transpose(int   a【】【5】);

系统都把a看做一个行指针变量,请问什么是行指针变量啊?怎么看的

 

 

#include<stdio.h>

int   max   (int   a,int   b)

{   

     int    m;

      if(a>b)

               m=a;

  else

             m=b;

  return     m;

}

int    main()

{

          int  (*fun)(int  a,int   b);

           int  x,y,m;

          *fun=max;

          scanf("%d %d",&x,&y);

        m=(*fun)(x,y);

         printf("x=%d,y=%d,max=%d\n",x,y,m);

}

 

请问  *fun=max这样写对不对的?是不是该写成fun=max,*fun是取fun指针所知变量的值,而max是函数max的首地址,所以怎么能把变量值赋给首地址呢?

追问:因为a[0]的类型是int [5]。。。。这句话是什么意思?数组的类型不是int   char   或者指针数组吗?加个【5】是什么意思?
答案:第一个问题:

void   transpose (int(*a)[5]);

void   transpose (int   a[][5]);


其实真的没有什么行指针,所谓行指针只是方便你理解二维数组。


这里第一个a的类型是int (*)[5],是一个指向一个有5个整型元素的数组的指针,因为[]操作符的优先级高于*,所以用必须用括号,说明这里先是一个指针,然后才是[],说明这个指针指向一个数组。如果去掉括号,声明变成

      int *a[5]

这相当于声明了一个数组,这个数组有5个元素,每个元素都是一个指向整型对象的指针。


第二个a是一个二维数组,这个二维数组的第一维(也就是行数)是未知的,第二维(也就是列数)是5。

C里的二维数组其实就是数组的数组,可以理解为一个特殊的一维数组,只不过这个数组的每个元素都是一个一维数组。

把a作为一个一维数组,那么第一个元素是a[0],这个元素也是一个一维数组,它的类型是int [5],a[0]就等于是二维数组的第一行。a[1],a[2]。。。。。。依次为第二行,第三行。。。。。。

在C语言里,数组名就相当于指向数组第一个元素的指针,所以a就等于是指向a[0]的指针,因为a[0]的类型是int [5],所以这个a的类型就是int (*)[5],和上面的int(*a)[5]是一样的,它们都指向二维数组的某一行。


为什么后面必须要有5呢?

因为指针是可以运算的,比如说a++,a+1这样都将指向下一行,编译器必须得知道需要跳过几个列才能到下一行,所以行数可以未知,但列数绝对不能省略。



第二个问题

*fun=max

因为*f的类型是一个函数,不是一个左值,所以这样写是在VC2008里是警告,GCC4就直接是错误了。

正确的写法应该是
fun=&max;

&是可以省略的,因为函数名被使用时总是由编译器把它转换为函数指针,&操作符只是显示说明了编译器将隐式执行的任务,所以这样

fun=max;

写也是正确的。



int a[2][2]={ {1,2},

                    {3,4}};

void   transpose(int (*a)[2]);

a[0] 即代表 {1,2}这行的首地址,而a则是这整个数组的首地址(a[0]的类型为int [2],a的类型为int (*)[2]);

 

 

*fun=max正确但是为了与其他指针写法一致 建议使用fun=max写法,而调用的时候使用(*fun)(a,b);写法

(函数指针fun与对它进行解引用操作*fun没什么本质区别)

 

 

 

 

上一个:C语言的发展史?
下一个:求C语言题目

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,