C语言指针问题:用指向指针的指针方法对n个整数排序并输出。要求将排序单独写成一个函数。

n和各整数在主函数中输入,结果在主函数中输出。我写的代码有问题,请帮忙看看吧
#include<stdio.h>
int main()
{
int n,i,j,t;
int **p;
printf("请输入整数个数:\n");
scanf("%d",&n);
int *a[n];
printf("请输入各个整数:\n");
for(i=0;i<n;i++)
scanf("%d",a[i]);
void fun(int *a[n]);
fun(*a[n]);
for(i=0;i<n;i++)
printf("%d",**(p+i));
printf("\n");
return 0;
}
void fun(int *a[n])
{
int **p,t,j,i,n;
for(i=0;i<n;i++)
p=a+i;
for(j=0;j<n;j++)
for(i=0;i<n-j;i++)
if(**(p+i)>**(p+i+1))
{
t=**(p+i);
**(p+i)=**(p+i+1);
**(p+i+1)=t;
}
printf("排序后为:\n");
}

首先,要说明的是:数组名,是一个指针,它指向存放数组元素的一块内存区域,那么数组元素是怎么被引用的呢,我举个例子。如a[3],编译系统会首先找到这个数组的首地址,即a,然后根据〔〕中的值确定地址偏移量,即3,由此便确定了,要引用的元素是地址a+3所指向的单元的内容。你知道〔〕叫什么吗?它不只是“方括号”,在C中它的名字叫“偏址运算符”,由此可知它的作用是什么。在C++中,〔〕是可以被重载的。

明白了上面那一点后,再来看,那么指针变量p和数组名a便具有了相同的性质,即:都是一个指针。

(1)p+1,a+2,p++,p=p+1,p-a当然都是合法的了。因为它们是相同类型的量之间进行的运算。只不过,这个量不同于一般存放数据的量,它存放的是地址罢了。

(2)a++,a=a+1,a=a-1之所以非法,是因为一旦为数组分配了内存空间后,其首地址是确定的了,就相当于一个常量,常量怎么可以改变呢?

这里,你可能会有点疑惑。但我只想说一句:“对变量(或常量)的引用不等于改变这个变量(或常量)”,你好好的揣摩一下。如p-a,a-2等只是引用a的值进行计算,但a本身的值并没有改变,而a++,即a=a+1却是硬生生地尝试去改变a,你看,是这样的吗?或许换个写法你看着更直观一些,如:k=p-a与a=a-1

(3)关于它们的意思,其实我前面已经说了。既然p,a是指针,存放的是地址,那么对它们的操作当然是改变地址的运算了,如p+1就指向地址为P+1的这个内存单元,。。。。。
对于a++,a=a-1这些非法的家伙嘛,就不用多说了,它试图去改变有用的数据单元,是绝对不能容忍的,我们需要的是稳定。。。。

===================
有括号的情况下func是一个函数指针,而没括号它返回一个int指针函数。
函数指针是指向函数的指针变量。
每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。

指针函数是指带指针的函数,即本质是一个函数。我们知道函数都又有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。
我可以帮助你,你先设置我最佳答案后,我百度Hii教你。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-26
在main函数中P没有被赋值,在fun函数中的P是不会被main函数承认的。而且最好将所有变量定义放在函数开头
第2个回答  2010-11-27
#include<stdio.h>
#include<stdlib.h>
void fun(int *,int);
int main(void)
{
int n,i;
int *p=NULL;
printf("请输入整数个数:\n");
scanf("%d",&n);
p=(int*)malloc(n*sizeof(int));
printf("请输入各个整数:\n");
for(i=0;i<n;i++)
scanf("%d",p+i);
fun(p,n);
for(i=0;i<n;i++)
printf("%d\n",*(p+i));
free(p);
return 0;
}
void fun(int *p,int n)
{
int i,j,t;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(*(p+i)>*(p+j))
{
t=*(p+i);
*(p+i)=*(p+j);
*(p+j)=t;
}
printf("排序后为:\n");
}
第3个回答  2012-06-06
# include <stdio.h>
# define L 100

void sort(int *num[], int n);

int main(int argc, char *argv[])
{
int a[L];
int *num[L];
int n, i, **p=num;
scanf("%d", &n);
for (i=0; i<n; i++)
{
scanf("%d", &a[i]);
num[i]=&a[i];
}
sort(num, n);
for (i=0; i<n; i++)
printf("%d ", **(p+i));
}

void sort(int *num[], int n)
{
int *t;
int i, j, k;
for (i=0; i<n; i++)
{
for (j=i+1, k=i; j<n; j++)
{
if (*num[k]<*num[j]) k=j;
}
if (k!=i)
{
t=num[i];
num[i]=num[k];
num[k]=t;
}
}
}
第4个回答  2010-11-26
int **p;
怎么都是“**”声明指针是 int *p;
相似回答