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语言题目