指针问题,求助
//程序功能是将输入的5阶行列式中最大的数字放在中间,按照从上到下,从左到右的顺序,四个角分别放最小,第二小,第三小,第四小的值;#include <stdio.h>
void main()
{
void sort(int (*p));
int a, i, j;
printf("please input 5*5 array: \n");
for(i = 0; i < 5; i++) //一个一个输入行列式的每一个值;
{
for(j = 0; j < 5; j++)
{
scanf("%d", &a);
}
}
printf("\nThe 5*5 array is: \n"); //将行列式打印出来;
for(i = 0; i < 5; i++)
{
for(j = 0; j < 5; j++)
{
printf("%4d", a);
}
printf("\n");
}
printf("\nNow they are: \n");
sort(a); //调用sort函数
printf("\n");
}
void sort(int (*p))
{
int i, j, temp;
int *Max, *Min;
Max = p; //将行列式第一个地址赋给Max,赋给Min;
Min = p;
for(i = 0; i < 5; i++) //找出最大值地址;
{
for(j = 0; j < 5; j++)
{
if(*Max < *(*(p + i) + j))
{
Max = *(p + i) + j;
}
if(*Min > *(*(p + i) + j)) //找出最小值地址;
{
Min = *(p + i) + j;
}
}
}
temp = *(*(p + 2) + 2); //最大值与中间值交换;
*(*(p + 2) + 2) = *Max;
*Max = temp;
temp = *Min; //最小值与第一行第一列的值交换;
*Min = *p;
*p = temp;
Min = *p + 1;
for(i = 0; i < 5; i++)
{
for(j = 0; j < 5; j++)
{
if(*(*(p + i) + j) != *p) && (*Min > *(*(p + i) + j))) //判断条件为循环值不等于最小值,且大于*Min;
{
Min = *(p + i) + j; //找出第二小值地址;
}
}
}
temp = *Min; //将第二小值与第一行第五列值交换;
*Min = *(*p + 4);
*(*p + 4) = temp;
Min = *p + 1;
for(i = 0; i < 5; i++) //找出第三小值;
{
for(j = 0; j < 5; j++)
{
if(*(*(p + i) + j) != *p) && (*(*(p + i) + j) != *(*p + 4)) && (*Min > *(*(p + i) + j)))
{
Min = *(p + i) + j;
}
}
}
temp = *Min; //第三小值与第五行第一列值交换;
*Min = *(*(p + 4));
*(*(p + 4)) = temp;
Min = *p + 1; //找出第四小值地址;
for(i = 0; i < 5; i++)
{
for(j = 0; j < 5; j++)
{
if((*(*(p + i) + j) != *p) && (*(*(p + i) + j) != *(*p + 4)) && (*(*(p + i) + j) != *(*(p + 4))) && (*Min > *(*(p + i) + j)))
{
Min = *(p + i) + j;
}
}
}
temp = *Min; //第四小值与第五行第五列值交换;
*Min = *(*(p + 4) + 4);
*(*(p + 4) + 4) = temp;
for(i = 0; i < 5 ; i++) //打印交换过后的行列式;
{
for(j = 0; j < 5; j++)
{
printf("%4d", *(*(p + i) + j));
}
printf("\n");
}
}
编译过后出现了好多问题,检查了很久,可能是指针问题,求大神看看。
0.c
C:\Documents and Settings\桌面\10\10.c(46) : warning C4047: '=' : 'int *' differs in levels of indirection from 'int (*)'
C:\Documents and Settings\\桌面\10\10.c(48) : warning C4047: '=' : 'int *' differs in levels of indirection from 'int (*)'
C:\Documents and Settings\\桌面\10\10.c(71) : warning C4047: '=' : 'int ' differs in levels of indirection from 'int *'
C:\Documents and Settings\桌面\10\10.c(72) : warning C4047: '=' : 'int ' differs in levels of indirection from 'int '
C:\Documents and Settings\chgtx\桌面\10\10.c(72) : error C2106: '=' : left operand must be l-value
C:\Documents and Settings\chgtx\桌面\10\10.c(79) : warning C4047: '!=' : 'int ' differs in levels of indirection from 'int '
C:\Documents and Settings\chgtx\桌面\10\10.c(79) : error C2143: syntax error : missing ';' before '&&'
C:\Documents and Settings\chgtx\桌面\10\10.c(86) : error C2065: 'Min' : undeclared identifier
C:\Documents and Settings\chgtx\桌面\10\10.c(86) : error C2100: illegal indirection
C:\Documents and Settings\chgtx\桌面\10\10.c(86) : error C2099: initializer is not a constant
C:\Documents and Settings\chgtx\桌面\10\10.c(87) : error C2040: 'Min' : 'int *' differs in levels of indirection from 'int '
C:\Documents and Settings\chgtx\桌面\10\10.c(87) : error C2065: 'p' : undeclared identifier
C:\Documents and Settings\chgtx\桌面\10\10.c(87) : error C2100: illegal indirection
C:\Documents and Settings\chgtx\桌面\10\10.c(87) : error C2100: illegal indirection
C:\Documents and Settings\chgtx\桌面\10\10.c(87) : error C2099: initializer is not a constant
C:\Documents and Settings\chgtx\桌面\10\10.c(88) : error C2143: syntax error : missing ')' before '+'
C:\Documents and Settings\chgtx\桌面\10\10.c(88) : error C2143: syntax error : missing '{' before '+'
C:\Documents and Settings\chgtx\桌面\10\10.c(88) : error C2059: syntax error : '+'
C:\Documents and Settings\chgtx\桌面\10\10.c(88) : error C2059: syntax error : ')'
C:\Documents and Settings\chgtx\桌面\10\10.c(90) : error C2100: illegal indirection
C:\Documents and Settings\chgtx\桌面\10\10.c(91) : error C2059: syntax error : 'for'
C:\Documents and Settings\chgtx\桌面\10\10.c(91) : error C2143: syntax error : missing '{' before '<'
C:\Documents and Settings\chgtx\桌面\10\10.c(91) : error C2059: syntax error : '<'
C:\Documents and Settings\chgtx\桌面\10\10.c(91) : error C2143: syntax error : missing '{' before '++'
C:\Documents and Settings\chgtx\桌面\10\10.c(91) : error C2059: syntax error : '++'
C:\Documents and Settings\chgtx\桌面\10\10.c(91) : error C2059: syntax error : ')'
C:\Documents and Settings\chgtx\桌面\10\10.c(102) : error C2374: 'temp' : redefinition; multiple initialization
C:\Documents and Settings\chgtx\桌面\10\10.c(86) : see declaration of 'temp'
C:\Documents and Settings\chgtx\桌面\10\10.c(102) : error C2100: illegal indirection
C:\Documents and Settings\chgtx\桌面\10\10.c(102) : error C2099: initializer is not a constant
C:\Documents and Settings\chgtx\桌面\10\10.c(103) : error C2040: 'Min' : 'int *' differs in levels of indirection from 'int '
C:\Documents and Settings\chgtx\桌面\10\10.c(103) : error C2100: illegal indirection
C:\Documents and Settings\chgtx\桌面\10\10.c(103) : error C2100: illegal indirection
C:\Documents and Settings\chgtx\桌面\10\10.c(103) : error C2099: initializer is not a constant
C:\Documents and Settings\chgtx\桌面\10\10.c(104) : error C2143: syntax error : missing ')' before '+'
C:\Documents and Settings\chgtx\桌面\10\10.c(106) : error C2374: 'Min' : redefinition; multiple initialization
C:\Documents and Settings\chgtx\桌面\10\10.c(106) : error C2100: illegal indirection
C:\Documents and Settings\chgtx\桌面\10\10.c(106) : error C2099: initializer is not a constant
C:\Documents and Settings\chgtx\桌面\10\10.c(107) : error C2059: syntax error : 'for'
C:\Documents and Settings\chgtx\桌面\10\10.c(107) : error C2143: syntax error : missing '{' before '<'
C:\Documents and Settings\chgtx\桌面\10\10.c(107) : error C2059: syntax error : '<'
C:\Documents and Settings\chgtx\桌面\10\10.c(107) : error C2143: syntax error : missing '{' before '++'
C:\Documents and Settings\chgtx\桌面\10\10.c(107) : error C2059: syntax error : '++'
C:\Documents and Settings\chgtx\桌面\10\10.c(107) : error C2059: syntax error : ')'
C:\Documents and Settings\chgtx\桌面\10\10.c(118) : error C2374: 'temp' : redefinition; multiple initialization
C:\Documents and Settings\chgtx\桌面\10\10.c(86) : see declaration of 'temp'
C:\Documents and Settings\chgtx\桌面\10\10.c(118) : error C2100: illegal indirection
C:\Documents and Settings\chgtx\桌面\10\10.c(118) : error C2099: initializer is not a constant
C:\Documents and Settings\chgtx\桌面\10\10.c(119) : error C2040: 'Min' : 'int *' differs in levels of indirection from 'int '
C:\Documents and Settings\chgtx\桌面\10\10.c(119) : error C2100: illegal indirection
C:\Documents and Settings\chgtx\桌面\10\10.c(119) : error C2100: illegal indirection
C:\Documents and Settings\chgtx\桌面\10\10.c(119) : error C2099: initializer is not a constant
C:\Documents and Settings\chgtx\桌面\10\10.c(120) : error C2143: syntax error : missing ')' before '+'
C:\Documents and Settings\chgtx\桌面\10\10.c(122) : error C2059: syntax error : 'for'
C:\Documents and Settings\chgtx\桌面\10\10.c(122) : error C2143: syntax error : missing '{' before '<'
C:\Documents and Settings\chgtx\桌面\10\10.c(122) : error C2059: syntax error : '<'
C:\Documents and Settings\chgtx\桌面\10\10.c(122) : error C2143: syntax error : missing '{' before '++'
C:\Documents and Settings\chgtx\桌面\10\10.c(122) : error C2059: syntax error : '++'
C:\Documents and Settings\chgtx\桌面\10\10.c(122) : error C2059: syntax error : ')'
C:\Documents and Settings\chgtx\桌面\10\10.c(133) : error C2059: syntax error : '}'
Error executing cl.exe. int *Max;这是MAX的定义
int (*p);这是p的定义
它们类型不一样。
Max = p; //将行列式第一个地址赋给Max,赋给Min;
这行是你写的,所以给警告 如果是运行期间崩了 这个可能真的是野指针 空指针的问题
但是少年 编译器明明告诉你了具体的错误信息 发生的位置 以及错误类型
那么多地方 不是少了个分好 就是少了个括号 这个语法错误 完全有能力自己改正
何必把一大堆 语法还存在错误的代码 丢上来 让别人给你改语法错误 ryxcaixia 发表于 2015-9-11 14:22
如果是运行期间崩了 这个可能真的是野指针 空指针的问题
但是少年 编译器明明告诉你了具体的错误信息 发生 ...
底下循环的应该是没错的,因为我是看了书上的答案,只把指针方面按自己的想法的改了,就出现了这么多错误,如果单纯是语法错误我检查了2遍,出现这么多错误应该是指针方面出了问题,不知道你有没贴下代码,编译下,本人刚接触指针 仰望天上的光 发表于 2015-9-13 10:10
int *Max;这是MAX的定义
int (*p);这是p的定义
它们类型不一样。
我试过将Max定义为int (*Max);结果差不多,好多问题 我是来得鱼币的 y290176346 发表于 2015-9-16 15:13
我是来得鱼币的
鱼哥 我刚接触论坛,不知道这个叫关水 我是看他们这么发 我才这样的,有过一次警告过,后来我就不这么发了 ,你罚的这次是很久以前发的,能不能高抬贵手把这几个鱼币换给我
页:
[1]