小白求助,关于二维数组的指针用法,求大神帮助,谢谢。

AXDii 2016-11-01 11:26:33
小白编写了一个用指针将二维数组转置的程序,程序如下:


#include<stdio.h>
int a[3][3]={1,2,3,4,5,6,7,8,9},b[3][3]={0},*p=a[0],*q=b[0],i,j;
void zh(int *,int *);
void sc(int *);
int main()
{
printf("矩阵转置前:\n\n");
sc(p);
printf("矩阵转置后:\n\n");
zh(p,q);
return 0;
}
void zh(int *p1,int *q1)
{
for(i=0;i<3;i++)
for(j=0;j<3;j++)
*(*(q1+j)+i)=*(*(p1+i)+j);
sc(q1);
}
void sc(int *p2)
{
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%-2d",*(*(p2+i)+j));
printf("\n");
}
}


编译器报错如下:
In function 'void zh(int*, int*)':
[Error] invalid type argument of unary '*' (have 'int')
[Error] invalid type argument of unary '*' (have 'int')
D:\SEIn function 'void sc(int*)':
[Error] invalid type argument of unary '*' (have 'int')



小白觉得是void zh(int *p1,int *q1)这里错了,但书上讲的不太清楚,不太会改,求大神帮助,谢谢。
...全文
95 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ck2333 2016-11-01
  • 打赏
  • 举报
回复
首先你得弄懂指针,*(*(p+i)+j)这个表示的并不是你说的b[i][j]。可以说你这个表示方法是错的,因为你这个其实是说p是一个指向指针的指针然后对p进行一系列的操作。
赵4老师 2016-11-01
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组
AXDii 2016-11-01
  • 打赏
  • 举报
回复
引用 2 楼 qq_36409192 的回复:
还有就是你那个*(*(p+i)+j)没懂你这个想干嘛。如果你只是想将a中的值转置后存入b中,可以直接利用两个参数i,j。一个表示行,一个表示列,然后b[j][i]=a[i][j]就行了(注意:只需要转置矩阵的一个三角,不然就会转置两次,又回到了原二维数组)。
题目要求用的是指针,类似于*(*(p+i)+j)的,*(*(p+i)+j)应该代表b[j][i]
CCM163 2016-11-01
  • 打赏
  • 举报
回复
a[0]其实是一个一维数组的首地址
ck2333 2016-11-01
  • 打赏
  • 举报
回复
还有就是你那个*(*(p+i)+j)没懂你这个想干嘛。如果你只是想将a中的值转置后存入b中,可以直接利用两个参数i,j。一个表示行,一个表示列,然后b[j][i]=a[i][j]就行了(注意:只需要转置矩阵的一个三角,不然就会转置两次,又回到了原二维数组)。
ck2333 2016-11-01
  • 打赏
  • 举报
回复
指针只能指向地址,所以你*p=a[0]明显是错的(你这表示的是赋值),应该改为*p=a(表示指向数组a的首地址)。还有就是函数的声明,函数的声明要带上形参。
AXDii 2016-11-01
  • 打赏
  • 举报
回复
引用 6 楼 qq_36409192 的回复:
首先你得弄懂指针,*(*(p+i)+j)这个表示的并不是你说的b[i][j]。可以说你这个表示方法是错的,因为你这个其实是说p是一个指向指针的指针然后对p进行一系列的操作。
不好意思,我之前理解错了,实际*(*(p+i)+j)是不等于b[i][j]的,*(*(p+i)+j)是指针类型
AXDii 2016-11-01
  • 打赏
  • 举报
回复
引用 8 楼 qq423399099 的回复:
改成这样:

#include<stdio.h>
int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, b[3][3] = { 0 }, (*p)[3] = a, (*q)[3] = b, i, j;
void zh(int(*p1)[3], int(*q1)[3]);
void sc(int(*p2)[3]);
int main()
{
	printf("矩阵转置前:\n\n");
	sc(p);
	printf("矩阵转置后:\n\n");
	zh(p, q);
	return 0;
}
void zh(int (*p1)[3], int (*q1)[3])
{
	for (i = 0; i<3; i++)
	for (j = 0; j<3; j++)
		*(*(q1 + j) + i) = *(*(p1 + i) + j);
	sc(q1);
}
void sc(int (*p2)[3])
{
	for (i = 0; i<3; i++)
	{
		for (j = 0; j<3; j++)
			printf("%-2d", *(*(p2 + i) + j));
		printf("\n");
	}
}
谢谢,看了您修改的地方,我明白什么地方出错了
小灸舞 版主 2016-11-01
  • 打赏
  • 举报
回复
改成这样:

#include<stdio.h>
int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, b[3][3] = { 0 }, (*p)[3] = a, (*q)[3] = b, i, j;
void zh(int(*p1)[3], int(*q1)[3]);
void sc(int(*p2)[3]);
int main()
{
	printf("矩阵转置前:\n\n");
	sc(p);
	printf("矩阵转置后:\n\n");
	zh(p, q);
	return 0;
}
void zh(int (*p1)[3], int (*q1)[3])
{
	for (i = 0; i<3; i++)
	for (j = 0; j<3; j++)
		*(*(q1 + j) + i) = *(*(p1 + i) + j);
	sc(q1);
}
void sc(int (*p2)[3])
{
	for (i = 0; i<3; i++)
	{
		for (j = 0; j<3; j++)
			printf("%-2d", *(*(p2 + i) + j));
		printf("\n");
	}
}
paschen 2016-11-01
  • 打赏
  • 举报
回复
你zh sc两个函数里,参数类型是int*指针,使用一个* 相当于解引一次,得到的是int类型了,再用*就会出错,因为int类型不是指针

69,371

社区成员

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

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