C++指针数组有点晕

caosz 发布于 2013/04/23 22:05
阅读 1K+
收藏 0

我说说我的理解,指针存储的是地址,指针数组里全是地址,而指针数组本身也有个地址,也是用指针表示的,表示的是该数组首地址,对吧?

我做了下面这道题,可是结果错了,麻烦诸位高人指点下,错误出在MAP函数那里,不胜感激。  

编写一个函数,传递给它一个大小为n的指向float类型的指针数组,要求该函数返回一个指针,指向n个按照倒序排列的float型数值的首地址.

#include <iostream>

using namespace std;
float* Map(float *p[], int n)
{
float *k;
for (int i=0;i<n-1;i++) 
{
k=*(p+i);
*(p+i)=*(p+i+1);
*(p+i+1)=k;
}
return *p;
}
void Disp(float a[], int n)
{
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
}
void Disp(float* a[], int n)
{
for (int i = 0; i < n; i++)
cout << *a[i] << " ";
cout << endl;
}
int main()
{
int n;
cin >> n;
float* a = new float[n];
for(int i = 0; i < n; i++)
cin >> a[i];
Disp(a, n);
float** p = new float* [n];
for (int i = 0; i < n; i++)
p[i] = &a[i];
Disp(p, n);
float* const b = Map(p, n);
Disp(b, n);
return 0;
}
加载中
0
caosz
caosz
#include <iostream>
using namespace std;
float* Map(float* p[], int n)
{
	for (int i=0;i<(n-1);i++)
		for (int j=i+1;j<n;j++)
		{
			float temp;
			temp=*p[i];
			*p[i]=*p[j];
			*p[j]=temp;
		}
	return *p;
}
void Disp(float a[], int n)
{
for (int i = 0; i < n; i++)
	cout << a[i] << " ";
cout << endl;
}
void Disp(float* a[], int n)
{
for (int i = 0; i < n; i++)
	cout << *a[i] << " ";
cout << endl;
}
int main()
{
int n;
cin >> n;
float* a = new float[n];
for(int i = 0; i < n; i++)
	cin >> a[i];
Disp(a, n);
float** p = new float* [n];
for (int i = 0; i < n; i++)
	p[i] = &a[i];
Disp(p, n);
float* const b = Map(p, n);
Disp(b, n);
return 0;
}


1
ling0
ling0

#include <iostream>
using namespace std;
float** Map(float *p[], int n)
{
    float *k;
    for (int i=0;i<n/2;i++) 
    {
        k=*(p+i);
        *(p+i)=*(p+n-1-i);
        *(p+n-1-i)=k;
    }
    return p;
}
void Disp(float a[], int n)
{
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
}

void Disp(float* a[], int n)
{
    for (int i = 0; i < n; i++)
        cout << *a[i] << " ";
    cout << endl;
}
int main()
{
    int n;
    cin >> n;
    float* a = new float[n];
    for(int i = 0; i < n; i++)
        cin >> a[i];
    Disp(a, n);
    float** p = new float* [n];
    for (int i = 0; i < n; i++)
        p[i] = &a[i];
    Disp(p, n);
    float** const b = Map(p, n);
    Disp(b, n);
    return 0;
}
(注:没写过 C++, 以上代码没有编译,你试试,应该可以的。

不过,我不明白,你为什么不这样:)

#include <iostream>
using namespace std;
void Map(float p[], int n)
{
    float k;
    for (int i=0;i<n/2;i++)
    {
        k=*(p+i);
        *(p+i)=*(p+n-1-i);
        *(p+n-1-i)=k;
    }
}
void Disp(float a[], int n)
{
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
}

int main()
{
    int n;
    cin >> n;
    float* a = new float[n];
    for(int i = 0; i < n; i++)
        cin >> a[i];
    Disp(a, n);
    Map(a, n);
    Disp(a, n);
    return 0;
}

0
Railgun
Railgun
float* Map(float *p[], int n)
{
    float *k;
    for (int i=0;i<n-1;i++)
    {
        k=*(p+i);
        *(p+i)=*(p+i+1);
        *(p+i+1)=k;
    }
    return *p;
}
void Disp(float a[], int n)
{
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
}
void Disp(float* a[], int n)
{
    for (int i = 0; i < n; i++)
        cout << *a[i] << " ";
    cout << endl;
}
int main()
{
    int n;
    cin >> n;
    float* a = new float[n];
    for(int i = 0; i < n; i++)
        cin >> a[i];
    Disp(a, n);
    float** p = new float* [n];
    for (int i = 0; i < n; i++)
        p[i] = &a[i]; 
    Disp(p, n); 
    float* const b = Map(p, n); 
    Disp(b, n); 
    return 0; 
}
caosz
caosz
回复 @Railgun : 好,谢啦。
Railgun
Railgun
回复 @caosz : 水平有限,看不出问题……要用插入代码才会有行号和缩进。直接贴上是没有的
caosz
caosz
嗯,复制的时候怎么保存格式呀,本身是有格式的。另外能帮忙看下哪错了吗?
Railgun
Railgun
没什么意思,就是看不惯没有缩进的代码……
0
pingdan32
pingdan32

map函数返回时这样:

return p;
map要求返回一个地址,p是指向数组的第一个元素,*p就是取出了第一个元素,怎么还能当做一个指针返回呢?

hayekshao
hayekshao
错误 1 error C2440: 'return' : cannot convert from 'float *[]' to 'float *' 楼主的代码没有错,如果将*p改为p会提示上面的错误!建议作者自己写代码,编译一下,不要只停留在理论上!
0
pingdan32
pingdan32

引用来自“pingdan32”的答案

map函数返回时这样:

return p;
map要求返回一个地址,p是指向数组的第一个元素,*p就是取出了第一个元素,怎么还能当做一个指针返回呢?

补充一下,我只看了map函数,你的返回值就是错的。。。后面有没有错我就不看了。。。
0
CSunDNan
CSunDNan
感觉那个倒序算法不对啊,直觉是交换相邻两个指针啊。
0
xiangxw
xiangxw

float* Map(float *p[], int n) 
{ 
	float k; 
	for (int i=0;i<n/2;i++)  
	{ 
		k=**(p+i); 
		**(p+i)=**(p+n-i-1); 
		**(p+n-i-1)=k; 
	} 
	return *p; 
}
比如输入 3 1 2 3,你想输出3 2 1??

觉得这种map函数没有什么意义。。


caosz
caosz
额,我做的题目举的输入的例子就是这个,我不知道倒序是指大小倒序,还是顺序倒叙?
0
吉尔伽美
由于Map函数返回的是*p, 也就是float* p[]中储存的第一个元素,即b中存储的为a[]第一个元素的地址。然后Disp(*a[], n),输出的是a[]的第一个元素,和&b + )及后面地址中存储的数据,因为没有为&b + 1及后面的内存赋值,所有输出乱码。我也有点说不清了~~~~~因为也不是太懂。。。但下面的代码是可以的


float** Map(float *p[], int n)
{
    float *k;
    for (int i=0;i<n-1;i++)
    {
        k=*(p+i);
        *(p+i)=*(p+i+1);
        *(p+i+1)=k;
    }
    return p;
}
void Disp(float a[], int n)
{
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
}
void Disp(float* a[], int n)
{
    for (int i = 0; i < n; i++)
        cout << *a[i] << " ";
    cout << endl;
}
int main()
{
    int n;
    cin >> n;
    float* a = new float[n];
    for(int i = 0; i < n; i++)
        cin >> a[i];
    Disp(a, n);
    float** p = new float* [n];
    for (int i = 0; i < n; i++)
        p[i] = &a[i];
    Disp(p, n);
    float** const b = Map(p, n);
    Disp(b, n);
    return 0;
}


吉尔伽美
回复 @caosz : 在我这执行正常的啊
caosz
caosz
我也有点晕,我问助教了,看看他怎么说。你这个代码比我那个好一点,假如输入3 1 2 3,返回值最后一行为2 3 0,错了一个。我那个不是0,是一个很奇怪的数。题目给定了其他内容,只有map函数那边需要修改
0
吉尔伽美
回复 @caosz : 你的MAP函数就是这个意思,a[0],...,a[n]变成a[1],...,a[n],a[0]
caosz
caosz
题目要的是返回3,2,1。
0
吉尔伽美
float** Map(float *p[], int n)
{
    float *k;
    for (int i=0, j = n -1;i < j;i++, j--)
    {
        k=*(p+i);
        *(p+i)=*(p+j);
        *(p+j)=k;
    }
    return p;
}
返回顶部
顶部