[问题求助]函数指针问题!

bgu 2003-05-23 05:32:34
代码如下:
----------------------------------------
void inv(int * x,int n)
{
int temp;
for (;x<=x+4;x++)
{temp=*x;*x=(*(x+n-1))--;*(x+n-1)=temp;}
return;
}
main()
{
int i,a[10]={3,7,9,44,0,1,2,5,4,6};
for (i=0;i<=9;i++);
printf ("%d",&a[i]);
printf("\n");
inv(a,10);
for (i=0;i<=9;i++)
printf("%d",a[i]);
printf("\n");
}
---------------------------------------
这个是tc的程序,可以运行,并没有发生什么语法的错误,可以一运行就会弹出一个对话框,是一个msg对话框来的,说什么我也没记下来,只知道对话框里有两个选择,一个是关闭一个是忽略。
请问,到底是为什么?到底哪里出错了!!
...全文
51 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
THEBEST 2003-05-24
  • 打赏
  • 举报
回复
程序可读性太差了!

我觉得可读取很重要!

这一点每个程序员都必需重视!
bgu 2003-05-24
  • 打赏
  • 举报
回复
plainsong(伤心的风★短歌) 大哥!
上面两个我都理解。但第三个递归就不好理解!!!能解释一下不??
我的理解是:
第一次形参n=10时,x[n - 1]即等于x[9]但为什么用n-2??而不用n-1呢?当然,你的程序是没错的,n-1是不行的,我只是理解不了!我只想到,如果n-2的话,那当n=10时就是n-2=8了。那再递归的话那x[n-1]不就是成了x[7]了!那x[8]去哪了?
能解释下好不?
fxxxxk 2003-05-24
  • 打赏
  • 举报
回复
x<=x+4

疯了?????

你当这是vb呀?????
短歌如风 2003-05-24
  • 打赏
  • 举报
回复
你只看到了n-2,却没有看到x+1啊!
其实这几个方法实现是一样的,都是从两端向中间循环执行交换。
要是有兴趣的话,看一下这个贴子,里面还有一些其它实现方法(不过是反转字符串的,因为有一个结束符'\0',所以和你的问题不太一样):
http://expert.csdn.net/Expert/TopicView1.asp?id=1723684
bgu 2003-05-24
  • 打赏
  • 举报
回复
//--------------------------------
void inv(int *x,int n)
{
int *p,temp,*i,*j,m=(n-1)/2;
i=x;j=x+n-1;p=x+m;
for (;i<=p;i++,j--)
{temp=*i;*i=*j;*j=temp;}
return;
}
main()
{int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("the original array:\n");
for (i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
inv(a,10);
printf("the array has been inverted:\n");
for (i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
}
//----------------------------------------
这一段很差么?这个可是谭浩强书上原本原样的。
我只是看到他怎么用那么多的指针来写一个这样的一个小小算法程序,这不是浪费资源了!所以就想用最少的定义来写它。我喜欢把一道题目用多种算法来写!!

还是说回正题吧!n-2怎么解????
短歌如风 2003-05-23
  • 打赏
  • 举报
回复
如果只用一个指针可以改为:
void inv(int *x, int n)
{
int i, j, temp;
for (i = 0, j = n - 1; i < j; i ++, j --)
{
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}

void inv(int *x, int n)
{
int i, temp;
for (i = 0; i < n / 2; i ++)
{
temp = x[i];
x[i] = x[n - 1 - i];
x[n - 1 - i] = temp;
}
}

void inv(int * x, int n)
{
int temp;
if (n > 1)
{
temp = *x;
*x = x[n - 1];
x[n - 1] = temp;
inv(x + 1, n - 2);
}
}
bgu 2003-05-23
  • 打赏
  • 举报
回复
嗯嗯嗯!!!
我明了!!!!!!
plainsong(伤心的风★短歌) 大哥谢谢!
短歌如风 2003-05-23
  • 打赏
  • 举报
回复
是不是这个意思:
void inv(int *x,int n)
{
int *y;
int temp;
for (y = x + n - 1; x < y; x ++, y --)
{
temp = *x;
*x = *y;
*y = temp;
}
}
bgu 2003-05-23
  • 打赏
  • 举报
回复
其实我只是写一个这样的程序:将数组a中的n个整数按相反的顺序存放。
这是源程序:
------------------------
void inv(int *x,int n)
{
int *p,temp,*i,*j,m=(n-1)/2;
i=x;j=x+n-1;p=x+m;
for (;i<=p;i++,j--)
{temp=*i;*i=*j;*j=temp;}
return;
}
main()
{int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("the original array:\n");
for (i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
inv(a,10);
printf("the array has been inverted:\n");
for (i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
}
------------------------------------
后来我改为在int函数里只用两个指针做出这个效果了也就是用*(x+n-1)把*j替换掉,程序如下:
------------------------------------
void inv(int *x,int n)
{
int temp,*i,m=5;
i=x;
for (;i<=x+m;i++,n--)
{temp=*i;*i=(*(x+n-1))--;*(x+n-1)=temp;}
return;
}
main()
{int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf("the original array:\n");
for (i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
inv(a,10);
printf("the array has been inverted:\n");
for (i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
}
---------------------------------------
再后来我又想如果只用一个指针可不可以实现?就把它改成了主题里的程序。没想到就出现了这样的事!!!!!
lbaby 2003-05-23
  • 打赏
  • 举报
回复
{temp=*x;*x=(*(x+n-1))--;*(x+n-1)=temp;}天,这是要干什么啊?
短歌如风 2003-05-23
  • 打赏
  • 举报
回复
你的代码中有很多问题,尤其是inv函数,我不知道你要作什么,只能从一般的角度去找错误了:
void inv(int * x,int n)
{
int temp;
for (;x<=x+4;x++)//这近乎于一个死循环(x<=x+4永远成立,直到发生溢出)。
{temp=*x;*x=(*(x+n-1))--;*(x+n-1)=temp;}//由于是死循环,这里将发生内存非法访问,这就是你看到的对话框的来源。
return;
}
main()
{
int i,a[10]={3,7,9,44,0,1,2,5,4,6};
for (i=0;i<=9;i++);//这是一个空循环,是不是多写一个分号?
printf ("%d",&a[i]);//由于前一条语句是空循环,这条语句只执行一次,并且这里i为10,有越界访问,不过不会产生非法访问,从而很难发现。为什么要输入地址呢?是不是应该是printf("%d",a[i])?
printf("\n");
inv(a,10);
for (i=0;i<=9;i++)
printf("%d",a[i]);
printf("\n");
}

根据我的理解(不一定对),把你的main改一下:

main()
{
int i,a[10]={3,7,9,44,0,1,2,5,4,6};
for (i=0;i<=9;i++)
printf ("%d",a[i]);
printf("\n");
inv(a,10);
for (i=0;i<=9;i++)
printf("%d",a[i]);
printf("\n");
}
不过由于实在不明白你的inv函数,只好由你自己去修改它了。
zqone 2003-05-23
  • 打赏
  • 举报
回复
void inv(int * x,int n)
{
int temp;
for (;x<=x+4;x++)
{temp=*x;*x=(*(x+n-1))--;*(x+n-1)=temp;}
return;
}
会不会死循环
x<x+4,不是总满足吗???
一.C语言基础 1.C语言特点(识记); 2.C语言程序基本组成(识记): 3.基本数据类型: 3.1 标识符与基本数据类型(识记), 3.2 常量与变量(领会) 3.3 内存的概念(识记) 4.基本输入、输出函数(领会): 5.运算符与表达式(简单应用): 5.1 运算符的优先级与结合性 二.程序控制结构 1.C语言的语句(识记): 2.顺序结构(领会): 3.分支结构(简单应用): 4.循环结构(综合应用): 5 算法特点 6 流程图 三.构造型数据 1.数组(综合应用): 1.1 定义和引用 1.2 字符数组 1.3 指针和数组 2.结构类型: 2.1 结构类型的概念 2.2 结构类型定义及结构变量说明 2.3 结构变量的初始化 2.4 结构数组的初始化 3.联合类型(识记): 3.1 联合类型的概念 3.2 联合类型定义和联合变量说明 3.3 联合类型的使用 3.4 Struct 和 Union区别 4.枚举型(识记): 4.1 枚举型的定义 4.2 使用枚举型变量 5.typedef的用途(识记): 四.指针 1.指针与指针变量(识记): 2.指针运算符(领会): 3. 指针与函数 4.指针数组与指向指针的指针(识记): 5.指针与结构(领会): 6. 难点和易混淆 五.函数 1.常见的系统库函数(识记): 2.用户自定义函数(简单应用): 2.1函数定义 2.2 函数调用 2.3 函数声明 2.4 函数返回值 2.5 函数参数 3.函数之间的数据传递(领会): 4.函数的嵌套调用及递归调用(领会): 5.局部变量与全局变量(识记): 6.变量的存储类型与变量的初始化(领会): 7.编译预处理(领会): 六.文件 1.文件的基本概念,C语言中的两种文件(识记) 2.文件的打开、关闭和文件结束测试,文件的读写,文件的定位(识记) 2.1文件操作函数 2.2 文件权限 七.算法与编程(综合应用) 1 使用Turbo C集成开发环境调试程序 1.1.源程序的编写、编辑与改错(领会); 1.2.集成环境下的求助Help(识记); 1.3.程序的编译与目标代码的生成(识记); 1.4.程序的调试(综合应用): 1.5.了解Turbo C程序的常见错误提示(识记)。 2 重点编程题 八 位运算 1. & 2. | 3. ^ 4. ~ 5. << 6. >> ———————————————— 版权声明:本文为CSDN博主「kaikai_sk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/kaikai_sk/article/details/106061539
适合新手的教程,我自己也在学,以下是部分学习笔记 69 函数指针 70 动态内存分配 Dynamic memory pointer = new type pointer = new type [elements] 第一个表达式用来给一个单元素的数据类型分配内存。第二个表达式用来给一个数组分配内存。 例如: int * bobby; bobby = new int [5]; if (bobby == NULL) { // error assigning memory. Take measures. }; delete pointer; delete [ ] pointer; 在C语言中,为了动态分配内存,我们必须求助于函数库stdlib.h 因为该函数库在C++中仍然有效,并且在一些现存的程序仍然使用,所以我们下面将学习一些关于这个函数库中的函数用法。 函数malloc void * malloc (size_t nbytes); char * cp; cp = (char *) malloc (10); int * bobby; bobby = (int *) malloc (5 * sizeof(int)); 这一小段代码将一个指向可存储5个int型整数的内存块的指针赋给bobby,它的实际长度可能是 2,4或更多字节 数,取决于程序是在什么操作系统下被编译的。 int * bobby; bobby = (int *) calloc (5, sizeof(int)); malloc 和calloc的另一点不同在于calloc 会将所有的元素初始化为0。 它被用来改变已经被分配给一个指针的内存的长度。 void * realloc (void * pointer, size_t size); 参数pointer 用来传递一个已经被分配内存的指针或一个空指针,而参数size 用来指明新的内存长度。这个函数 给指针分配size 字节的内存。这个函数可能需要改变内存块的地址以便能够分配足够的内存来满足新的长度要 求。在这种情况下,指针当前所指的内存中的数据内容将会被拷贝到新的地址中,以保证现存数据不会丢失。函 数返回新的指针地址。如果新的内存尺寸不能够被满足,函数将会返回一个空指针,但原来参数中的指针 pointer 及其内容保持不变。 函数 free 这个函数用来释放被前面malloc, calloc 或realloc所分配的内存块。 void free (void * pointer); 注意:这个函数只能被用来释放由函数malloc, calloc 和realloc所分配的空间。 74 数据结构 76-78 结构指针(Pointers to structures) -> 这是一个引用操作符,常与结构或类的指针一起使用,以便引用其中的成员元素,这样就避免使用很多括号。例如,我们用: pmovie->title 来代替: (*pmovie).title 79 自定义数据类型(User defined data types) typedef existing_type new_type_name; typedef char C; typedef unsigned int WORD; typedef char * string_t; typedef char field [50]; 80 联合(Union) union mytypes_t { char c; int i; float f; } mytypes; 81 枚举Enumerations (enum) enum model_name { value1, value2, value3, . . } object_name; 例如,我们可以定义一种新的变量类型叫做color_t 来存储不同的颜色: enum colors_t {black, blue, green, cyan, red, purple, yellow, white}; 注意在这个定义里我们没有使用任何基本数据类型。换句话说,我们创造了一种的新的数据类型,而它并没有基 于任何已存在的数据类型:类型color_t,花括号{}中包括了它的所有的可能取值。例如,在定义了colors_t 列举 类型后,我们可以使用以下表达式: 84 类(Class) 类(class)是一种将数据和函数组织在同一个结构里的逻辑方法。定义类的关键字为class ,其功能与C语言中的struct类似,不同之处 是class可以包含函数,而不像struct只能包含数据元素。 类定义的形式是: class class_name { permission_label_1: member1; permission_label_2: member2; ... } object_name; 其中 class_name 是类的名称 (用户自定义的类型) ,而可选项object_name 是一个或几个对象(object)标识。Class的声明体中包含 成员members,成员可以是数据或函数定义,同时也可以包括允许范围标志 permission labels,范围标志可以是以下三个关键字中 任意一个:private:, public: 或 protected:。它们分别代表以下含义: ● private :class的private成员,只有同一个class的其他成员或该class的“friend” class可以访问这些成员。 ● protected :class的protected成员,只有同一个class的其他成员,或该class的“friend” class,或该class的子类(derived classes) 可以访问这些成员。 ● public :class的public成员,任何可以看到这个class的地方都可以访问这些成员。 如果我们在定义一个class成员的时候没有声明其允许范围,这些成员将被默认为 private范围。 以下是怎样读前面例子中出现的一些指针和类操作符 (*, &, ., ->, [ ]): ● *x 读作: pointed by x (由x指向的) ● &x 读作: address of x(x的地址) ● x.y 读作: member y of object x (对象x的成员y) ● (*x).y 读作: member y of object pointed by x(由x指向的对象的成员y) ● x->y 读作: member y of object pointed by x (同上一个等价) ● x[0] 读作: first object pointed by x(由x指向的第一个对象) ● x[1] 读作: second object pointed by x(由x指向的第二个对象) ● x[n] 读作: (n+1)th object pointed by x(由x指向的第n+1个对象) 由关键字struct和union定义的类 类不仅可以用关键字class来定义,也可以用struct或union来定义。 因为在C++中类和数据结构的概念太相似了,所以这两个关键字struct和class的作用几乎是一样的(也就是说在C++中struct定义的 类也可以有成员函数,而不仅仅有数据成员)。两者定义的类的唯一区别在于由class定义的类所有成员的默认访问权限为private,而 struct定义的类所有成员默认访问权限为public。除此之外,两个关键字的作用是相同的。 union的概念与struct和class定义的类不同, 因为union在同一时间只能存储一个数据成员。但是由union定义的类也是可以有成员函 数的。union定义的类访问权限默认为public。 94 操作符重载(Overloading operators) + - * / = < > += -= *= /= << >> <<= >>= == != <= >= ++ -- % & ^ ! | ~ &= ^= |= && || %= [] () new delete 96 this指针 97 静态成员(静态变量、静态函数)(Static members) 静态成员类直接访问,不属于类对象的成员 98 类之间的关系(Relationships between classes) 友元函数(Friend functions) 101 类的继承 记住,this 代表代码正在被执行的这一个对象的指针。 142 函数模块 154 出错处理 (Exception handling) 159 类型转换高级 (Advacned Class Type-casting) 163 typeid 164 预处理指令 168 标准函数库

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧