C语言高手快来帮忙

来源:百度知道 编辑:UC知道 时间:2024/09/22 23:37:42
#include<stdio.h>
void main()
{
int a[2][3]={1691,2,3,4,5,6};
int **p=a;
clrscr();
printf("%d\n%d\n",**a,*p);
}
为什么在这里**a能输出正确结果,而**p却不能,*p却能呢?

**a是数组的首元素,这是不用说明大家都能理解,问题就是**p,它明明是被初始化了可为什么不能正确输出呢?这还得从数组的定义这一块来说明:

int *p; //这是一个指向存有int 类型值的地址的指针;
int **p;//这是一个指向存有int指针类型值的地址的指针;虽然定义是这样定义了,但其实这时的p是没有任何意义的.它是没办法初始化的.除非是显式的定义为多维数组. (int b = 2;int *pb = &b;int **pb2 = &pb;当然像这样是可以初始化的,但是一般来说只是学习的时候可以这样写着玩玩,实际中是不会这样用的).

int a[2][3];//这是定义一个二维数组;问题就出在这里了.因为C语言中规定,数组是不能拷贝的.你可以再定义一个同样大小的空间,然后进里面的元素逐个拷贝;

从上面来看,你的int **p = a;这个赋值本身就是错误的(当然可能有的编译器不会报这个错误).如果你想给p赋值,你就得先定义一个空间不小于原来的数组的新数组,然后用一个循环来给数组中的元数逐个赋值,如:
int p[2][3];
for(int i = 0; i < 2;i++)
for(int j = 0; j <3 ;j++)
p[i][j] = a[i][j];

这时有人会问,int a[2] = {2,3}; int *p = a;为什么这里能复制?其实这里并没有复制数组,a可以是一个数组的首地址,也可以是一个元数的首地址,如果把a理解为一个元数的地址的话,则p就是指向 a[0]的指针而已.

你说的*p能正确输出,可能是因为你的编译器特殊吧.

**p=a是给了p 数组a的首行首地址
**a代表数组的首个元素
因此*p代表第一个元素 **p就无意义了