指针类型问题??

来源:百度知道 编辑:UC知道 时间:2024/06/07 03:57:49
这是求2维数组中全部元素之和的程序

mian()
{ int add(int arr[],int n);
static int a[3][4]={1,3,5,7,9,11,13,17,19,21,23};
int *p,total;
p=a[0];
total=add(p,12);
printf("%d",total);}

add(int arr[],int n)
{ int i,sum=0;
for(i=0;i<n;i++)
sum=sum+arr[i];
return sum;}

请问main中p=a[0];改成p=&a[0][0]为什么不行,两者在类型上有什么区别?

不是不可以,程序你运行试过了吗?
你可以打印a, a[0], &a[0], &a[0][0]出来看一看。他们都是同一个地址,只不过类型不同,a相当于一个二维的指针,而a[0]相当于一个一维的指针。&a[0][0]就是一个int数的地址。p申明的是一个一维指针,所以用a[0]是最合理的。其他的因为类型不同,所以在编译的时候编译器会发出警告,但是实际上的效果是相同的,都可以输出正确结果。因为他们的实际值是一样的,但是类型不同。

不过指针最好还是谨慎的指,这种明显的一维指针,当然是赋值a[0]了。避免发生意想不到的错误。

#include <stdio.h>
int add(int arr[],int n);
void main()
{
int add(int arr[],int n);
static int a[3][4]={1,3,5,7,9,11,13,17,19,21,23};
int *p,total;
//p=a[0]; //是给指针赋值,不是给指针指向的对象赋值。
p = &a[0][0];
/*
你这程序问题有点多,帮你随便修改了下。
你问的问题的答案;
p是你定义的int型的指针。a是你定义的一个二维数组,其中a[0]是指向数组第一行的指针,
所以p=a[0]可以的。
a[0][0]是指向你数组的第一行的第一个元素,是一个整形变量。
所以不行。
除非:*p = a[0][0]这样才可以!

对于你的问题:p = &a[0][0];这样的赋值是可以的。这里的&被视为取址,所以语法上是正确的,但是效果上就不清楚了。

*/
total=add(p,12);
printf("%d",total);}

int add(int arr[],int n)
{
int i,sum=0;
for(i=0;i<n;i++)
sum=sum+arr[