#include <stdlib.h>
int main()
{
int n;
scanf("%d", &n);
int* p = (int*)malloc(n * sizeof(int));
if (p == NULL)
{
printf("%s", strerror(errno));
}
int* p1 = p;
//p1
int i; //p
for (i = 0; i < n; i++) //_________________________________
{
scanf("%d", &(*(p+i)));
}
for (i = 0; i < n; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
///////////////////////////////////////
for (i = 0; i < n - 1 ; i++)
{
for (p=p1; p < p + n - 1; p++)
{
if (*p > *(p + 1))
{
int t;
t = *p; *p = *(p + 1); *(p + 1) = t;
}
}
//p = p - (n - 1);
}
for (i = 0; i < n; i++)
{
printf("%d ", *(p + i));
}
free(p);
p = NULL;
return 0;
}
最后始终是 if语句报错,不知道问题出现在哪里
修改如下,改动处见注释,原代码没什么大问题, for (p=p1; p < p + n - 1; p++) 这句死循环了,供参考:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d", &n);
int* p = (int*)malloc(n * sizeof(int));
if (p == NULL)
{
printf("%s", strerror(errno));
}
int* p1 = p; //p1 指向数组首地址 修改
//p1
int i; //p
for (i = 0; i < n; i++) //_________________________________
{
scanf("%d", &(*(p+i)));
}
for (i = 0; i < n; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
///////////////////////////////////////
for (i = 0; i < n - 1 ; i++)
{ // 修改
for (p=p1; p < p1 + n - 1; p++) //for (p=p1; p < p + n - 1; p++) p < p + n - 1 死循环了
{ //此时 p1 为数组的首地址 ,循环条件应改为:p < p1 + n - 1
if (*p > *(p + 1))
{
int t;
t = *p; *p = *(p + 1); *(p + 1) = t;
}
}
//p = p - (n - 1);
}
for (i = 0; i < n; i++)
{ // 修改
printf("%d ", *(p1 + i)); // printf("%d ", *(p + i)); p1 为数组首地址
}
free(p);
p = NULL;
return 0;
}
为什么要用这么多for语句做
运行报错,还是编译报错了?
报错,报什么错呢,把错误信息放出来呀
你把原来数组的指针 p 拿来循环,肯定报错,指定越界,改个名儿就行了:
for (i = 0; i < n - 1; i++)
{
for (int *ptr = p1; ptr < p + n - 1; ptr++)
{
if (*ptr > *(ptr + 1))
{
int t = *ptr;
*ptr = *(ptr + 1);
*(ptr + 1) = t;
}
}
//p = p - (n - 1);
}
由于指针p1和p指向的是一个地址,因此p++对应p1也++了。
代码修改如下所示:
#include <stdlib.h>
int main()
{
int n;
scanf("%d", &n);
int* p = (int*)malloc(n * sizeof(int));
if (p == NULL)
{
printf("%s", strerror(errno));
}
int* p1 = p;
//p1
int i,j; //p
for (i = 0; i < n; i++) //_________________________________
{
scanf("%d", &(*(p+i)));
}
for (i = 0; i < n; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
///////////////////////////////////////
for (i = 0; i < n - 1 ; i++)
{
for (j=i+1; j <= n - 1; j++)
{
if (*(p+i) > *(p + j))
{
int t;
t = *(p+i);
*(p+i) = *(p + j);
*(p + j) = t;
}
}
//p = p - (n - 1);
}
for (i = 0; i < n; i++)
{
printf("%d ", *(p + i));
}
free(p);
p = NULL;
return 0;
}
C语言中由一个分号 ; 隔开的就是一条语句
比如:
printf(“hehe”);