C语言关于指针的问题~~~

来源:百度知道 编辑:UC知道 时间:2024/06/16 01:29:35
float score[][4]={{60,70,80,90},{66,77,88,99},{65,75,85,95}};
这句如果换成:
float *score[][4]={{60,70,80,90},{66,77,88,99},{65,75,85,95}};
是什么意思啊

越详细越好:
#include<stdio.h>
void main()
{
float score[][4]={{60,70,80,90},{66,77,88,99},{65,75,85,95}};/*这如果加*号是什么意思呢?我试过了,加*号就不行了~~*/
float *search(float (*pointer)[4],int n);
float *p;
int i,m;
printf("enter the numbers of strdent:\n");
scanf("%d",&m);
printf("The of NO. %d are:\n",m);
p=search(score,m);
for(i=0;i<4;i++)
printf("%7.2f",*(p+i));
}
float *search(float (*pointer)[4],int n)
{
float *pt;
pt=*(pointer+n);
return (pt);
}

float score[][4]={{60,70,80,90},{66,77,88,99},{65,75,85,95}};
这句如果换成:
float *score[][4]={{60,70,80,90},{66,77,88,99},{65,75,85,95}};
是什么意思啊
就是吧score[][4]里的几个元素,就都定义为指针。

score[][4] 的score是score[][4]的首地址,search(score,m)函数里的实参
传递的是数组的首地址,其实score—>score[][4]的指针,*scre[][4]和*scre[][4]是不等价的。
假如你一个开始定义一个*scre[][4];那你就吧scre[][4]里的所有元素都定义
成指针了,你可以换个方法理解数组的元素就成二级指针了。那你形参(*pointer)[4]要接收的是scre[][4]的首地址,所以不符合。
举个例,
int a[3],*p;
p=a;if(p==&a[0]&&*p=a[0])为真;
假如:
int *a[3],*p;
*a[3]={&b,&c,&d}\\指针是存放地址的
p=a;则p指向{&b,&c,&d}
而不是p—>&b一个数而已了。
还有一点上面的已经说了。

加*号就是三维数组了。
*score[][4]表示指针数组

search的第一个形参pointer是一个指针——指向4个float构成的数组的指针.
float score[][4]的score作为实参, 类型正好合适.
为什么?

我们知道数组名可以表示其第一个元素的地址. 所以, score作为实参传递给search, 相当于&score[0]传递给search函数.

score[0]是什么? 它就是4个float构成的数组, 因此, &score[0]可以视为指向4个float构成的数组的指针, 与形参pointer的类型完全一致.

需要解释一下: 从本