高手进C++指针函数问题

#include "iostream.h"
int *findmax(int *array,int size,int *index);
void main(void){
int a[]={33,91,54,67,82,37,85,63,19,68}, *maxaddr, idx ;
maxaddr=findmax(a,sizeof(a)/sizeof(*a),&idx);
cout<<idx<<endl;
cout<<maxaddr<<endl;
cout<<a[idx]<<endl;
}
int *findmax(int *array,int size,int *index) {
int max,i;
max=*(array+0); //array[0];
for (i=1;i<size;i++)
if (max<*(array+i)) {
max=*(array+i);
*index=i;
}
return(array+*index);
}
为什么当中出现了idx和index 这2个都是指同一个东西吗?还有为什么idx 使用了&idx但是index使用了*index?int *findmax(int *array,int size,int *index);已经声明了是指针变量在下面的定义函数不是应该用取地址符号&了吗也就是int *findmax(int *array,int size,int *index) 按我的想法要写成int *findmax(int &array,int size,int &index) 而且怎么size没有符号&或者*点缀呢。。请高手详细解答该程序的流程和细节。谢谢。。
1.例】 定义findmax()函数,其功能是寻找数组中的最大元素,将该元素的下标通过参数返回,并返回其地址值,编程实现findmax()函数。感谢楼下沙发高手替我解答了。。小弟不才还有些小疑问。程序执行结果为:
idx使用&运算符是对其做取地址运算然后传递给指针型参数index,可是idx在整个程序
过程中没有看到他表示什么东西。是不是传递之后index又反过来传递给idx了。也就是
使用指针可以双向传递?不是说实参形参只能单向传递的吗?
还有为什么不直接使用index也就是使用cout<<*index也是一样输出元素下标啊
2.例】 定义findmax()函数,其功能是寻找数组中的最大元素,将该元素的下标通过参数返回,并返回其地址值,编程实现findmax()函数。感谢楼下沙发高手替我解答了。。小弟不才还有些小疑问。程序执行结果为:1
0×0012FF5C
91
Press any key to continue
怎么对应不上cout<<idx<<endl;
cout<<maxaddr<<endl; 麻烦大家
cout<<a[idx]<<endl;
第一个是说输出地址,把第二个是输出元素下标,第三个是输出最大值。在函数声明时候出现的idx好像没有说是指谁的地址诶好奇怪怎么就可以输出。

先把代码改了一遍,实在看了别扭。
#include <iostream>

int* findmax(int *array, int size, int *index)
{
int max
int i;
max = *(array+0); //array[0];
for (i=1; i<size; ++i)
{
if(max < *(array+i))
{
max = *(array+i);
*index = i;
}
}
return(array + *index);
}

int main()
{
int a[] = {33,91,54,67,82,37,85,63,19,68};
int* maxaddr;
int idx ;
maxaddr = findmax(a, sizeof(a)/sizeof(*a), &idx);
std::cout<<idx<<std::endl;
std::cout<<maxaddr<<std::endl;
cout<<a[idx]<<endl;
return 0;
}
///////////////////我是分割线(* ̄▽ ̄*)///////////////////
好了,开始回答问题。
先说一下findmax函数。这个函数有三个参数,分别是int指针对象,一个int对象,和一个int指针变量。这个函数有一个返回值是int指针对象。请注意,这些都是C++的说法,与C里面变量的说法不一样。包括上面代码中有一些重要的可以变动的地方正是C++与C的不同。
通过函数定义可以看出,第一个参数是某个内存区的首地址指针,当然数组首地址也可以,第二个参数是要寻找的内存的大小,当然,数组大小也可以,第三个参数是用来保存这片内存中最大值的下标的,请注意,不是最大值的指针。返回值才是最大值的指针。
然后谈一谈函数参数传递的问题。
///////////////////我是分割线(* ̄▽ ̄*)///////////////////
C/C++的参数是按值传递的,除非使用引用(或指针)。也就是说不管什么样的参数,都是复制一份参数的值创建临时对象,然后函数使用这些临时对象。这个显而易见,比如
#include <iostream>

void nagitive(int n)
{ n = -n; }

int main()
{
int a=1;
nagitive(a);
std::cout<<a<<std::endl;//输出1
return 0;
}
由于是按值传递,所以函数改变的其实是复制的临时对象。
那么如果要改变对象的值怎么办?C里使用指针的办法,曲线救国,而C++里使用的是引用。来看看区别。
#include <iostream>

void nagitive(int* n)
{ *n = -*n; }

int main()
{
int a=1;
nagitive(&a);
std::cout<<a<<std::endl;//输出-1
return 0;
}
这里假设int对象a的地址是1234H。那么将a的地址传递给函数nagitive,其实还是创建了一个临时int指针对象,拷贝的是值1234H。并且使用解引用操作符将1234H地址中的内容取负。实际效果是修改了a。
C++则是使用引用
#include <iostream>

void nagitive(int& n)
{ n = -n; }

int main()
{
int a=1;
nagitive(a);
std::cout<<a<<std::endl;//输出-1
return 0;
}
一旦参数使用引用,有两个好处,一是参数不再按值拷贝了,节省了开销,另一方面是参数是直接传递进来的,可以直接修改参数的值。
两者对比可以发现,C++的引用机制明显更有优势,第一,函数内部不需要再对每个形参写解用符,第二,函数调用时也不用取地址符给实参取地址。在C++里面还有另一个作用是某些类对象没有复制构造函数,因此不能复制,所以必须使用引用,比如std::iostream流对象std::cin,std::cout。
再谈谈返回值问题。
///////////////////我是分割线(* ̄▽ ̄*)///////////////////
由于C/C++可以有多个参数(包括不定参),但只能有且只能有一个返回值(包括void)。所有,函数需要返回多个值怎么办?
有几种方法可供选择。
一,创建对象,将对象作参数传递进函数,函数内部修改这些对象;
二,将需要返回的对象“打包”,比如创建结构体,函数返回结构体。
LZ的代码显然是采用了第一种方法,使用了findax函数的int* index正是用来保存最大值下标的。至于为什么参数是int*而不是int,上面已经说过了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-08-25
idx和index 这2个都是指同一个东西吗?
不是,一个是整形变量,1个是指针变量,怎么可能指同1个东西呢?1个是整数,1个是地址,

idx是实参而且是整形,形参是指针类,要把实参传递给形参当然要类型相同,即传递idx的地址给形参,所以用取址符号&,

第3个问题我觉得太蠢了,1个是声明,1个是定义,当然参数写法一样,又不是调用

最后那个问题,在声明时已经定义SIZE是整形,干吗用*和&?

我看你连函数调用以及形参实参都搞不懂,而且象不同类型间的赋值那么简单而且算是很前期的知识动没搞懂,怎么能学好指针呢?
第2个回答  2010-08-25
前面部分1L答的差不多了,我答补充的部分
你把两个说反了,第一个输出的是元素下标,第二个是输出地址,显然第一个是整形第二个是指针型吧。之所以定义函数的时候定义成int *index是因为C/C++里的形参是传值,无法直接返回结果,所以要定义成指针形式,其实返回的仍然是一个整形。建议从头开始重新看C的相关知识(函数调用、形参实参等等),推荐一本书叫C++ Primer,网上应该能找到电子版。
第3个回答  2010-08-25
//你自己被自己搞糊途了,实际上,看一下我的注释你应该就明白了
#include "iostream.h"
int *findmax(int *array,int size,int *index);
void main(void){
int a[]={33,91,54,67,82,37,85,63,19,68}, *maxaddr, idx ;
maxaddr=findmax(a,sizeof(a)/sizeof(*a),&idx);
/* (&idx)表示变量idx的地址,这里作为"实参",传递给形参index*/
cout<<idx<<endl;
cout<<maxaddr<<endl; /*maxaddr就与&a[idx]完全相等*/
cout<<a[idx]<<endl;
}
/* 形参index是一个指针变量,可以保存(接受)指针类型的实参值,当&idx传给index后,它们是同一个东西,即都是变量idx的地址*/
int *findmax(int *array,int size,int *index) {
int max,i;
max=*(array+0); //array[0];
for (i=1;i<size;i++)
if (max<*(array+i)) {
max=*(array+i);
*index=i; /* (*index)实际上就是*(&idx),且其值变成了i,也就是说主函数中的变量idx变成了i*/
}
return(array+*index); /*这里返回array的第*index个元素的地址,实际上在主函数对应的就是&array[idx]的地址*/
}本回答被提问者采纳

关于c++指针的问题请高手赐教
因此如a[i]这样的访问都被编译器改写或解释为*(a+i)的形式,同样取下标操作符的操作数是可交换的,所以a[3]可以写成3[a],不过通常你不会这样做。2、下标总是与指针的偏移量相同,下标*sizeof(元素类型)就是偏移数组起始地址的实际字节数。3、“作为函数参数的数组名”等同于指针,任何传递给函...

c++虚函数问题,大神请进
1,对函数指针来说,指针值是函数地址,取*还是函数地址,所以相等看起来是没啥问题的。2,不能这么调用,成员函数是隐含带有this参数的,和普通函数不一样。对象内存的第一个指针是vtable(如果有),vtable是一个void **类型的指针,每一项都是一个函数指针,所以你的代码也是没法正确运行的。以下是...

C++程序设计 整除问题,高手进
1、void count(int*a,int *n)定义一个无返回值的函数count,它有两个形式参数,第一个是指针a,指向int型数据,第二个是指针n,指向int型数据。2,3、参看注释 void countValue(int *a,int *n){ int i;n=0; \/\/n指向的内容赋值为0 for(i=1;i<=1000;i++){ if((i%7==0&&i%...

c\/c++中的指针的应用及注意问题
一、我们先来回忆一下指针的概念吧,方便下面的介绍指针是存放地址值的变量或者常量。例如:int a=1;a就表示指针常量(“”表示取地址运算符,也即引用)。int *b,b表示的是指针变量(注意,是b表示指针变量而不是*b),*表示要说明的是指针变量。大家注意int *b[2]和int(*b)[2]是不同的...

C++有关函数中void指针的问题
首先你这个函数就错了。你是不能直接对void指针进行操作的。如果你知道传进来的是何种数据,你在进行操作之前,得先进行转换,比如说:int *a = (int*)n \/\/n是形参 a=1;void r(void *n){ int *a=(int*)n;a = 0;a = *a - 1;cout << *a << endl;} int main(void){ unsi...

C++指针问题...为什么调用函数中要用void?
void*说明返回的是通用指针,不是说没有返回值。需要用强制转换成具体的类型。比如函数malloc返回的就是void*,需要根据不同的指针类型转换。如 int *a;a = (int*)malloc(sizeof(int));如果是你说的是以函数指针当做参数的,void*说明这个参数可以接受不同类型的函数。

VC++中的指针问题
1.指针的类型由他定义时指向的数据类型决定,即 int * pInt 可简称 int指针, void *(*fun)(int ,int) 即一个特定函数的指针,只能指向 接受(int,int)参数,返回void *类型的指针,所以它的类型较多,hoho。这也是为什么会出现多级指针,如 int **p的原因。这也是用好指针的关键,首先你要...

C++对指针有点疑惑不解
int *p=&a;晕,居然还有这种问题啊 在这里是初始化,是对变量进行初始化,在这语句中的变量是p而不是*p,因此对变量p进行初始化就要使用与该变量相应的值来进行初始化,因为变量p是指针,所以需要a的地址来初始化。再比如吧 int p[2]={1,2};在这里也是对变量p进行初始化,而不是对p[2]进行...

【面试常考题】C++的智能指针
智能指针的核心思想是通过类的封装,利用C++的类特性,尤其是默认的构造和析构函数。当我们创建一个智能指针对象时,它会自动管理内存的生命周期,确保在对象不再使用时,内存会被正确释放。这样,即使在出现问题时,也能保证内存的正确清理,降低了编程时的复杂性。掌握智能指针的关键在于理解其内部机制,...

有关C++函数调用问题。不明白里面的指针和&的用法。
C++调用函数的时候就是转向函数的入口地址,而函数指针就是保存的函数的入口地址所以你使用发fp(a,b)调用就相当于函数名调用你使用(*fp)(a,b)调用相当于把a,b作为参数,传递到fp指向的地址所以效果是一样的其实函数调用的时候使用函数名 f_i(a,b) 和 (*f_i)(a,b) 也能得到正确的结果道理...

相似回答
大家正在搜