如何打印存储在指向数组的指针中的元素数组,这个指向数组的指针存储在指针数组中?

时间:2014-08-15 18:45:47

标签: c pointers

嗨如何打印存储在数组指针中的元素数组,这个指向数组的指针存储在指针数组中?

/* note- ptoa is pointer to an array
aofp is array of pointer */

#include<stdio.h>

int main() {
     int i;
     int arr[3] = {1,2,3};   // integer array with 3 integers
     int (*ptoa)[3];         // ponter to an array
     ptoa = &arr;            // here i am storing 3 integer
                             // to ponter to an array
     int *aofp[1];           // this is array of pointer

     aofp[1] = ptoa;         // here i am sotring pointer to an array

     /* here i am trying to print all element of arr[3]
        using aofp i.e array of pointer*/

     for (i = 0; i < 3; i++)
         printf("%d", **aofp[i]);     // i know this is invalid 
         //please help me i want print all
         //element of arr i.e 1,2,3 using aofp?
}

4 个答案:

答案 0 :(得分:3)

问题

int *aofp[1]; // this is array of pointer

aofp指向int 的指针的单元素数组。

aofp[1]=ptoa;   // here i am sotring pointer to an array

在这里,您尝试将指向int 数组的指针指定给aofp。这些是不兼容的类型。此外,元素[1]不存在。这里有两个选项,可能更多:

选项1

您需要使用正确的类型声明aofp,并访问元素[0]

int (*aofp[1])[3];
aofp[0]=ptoa;

for(i=0;i<3;i++)
  printf("%d",(*aofp[0])[i]);
putchar ('\n');

aofp声明中的括号很重要,因为int *aofp[1][3]将是指针数组,而不是数组-of-指针到阵列即可。访问数组的值使用与声明相同的语法。检索指针数组的元素[0],取消引用指针(*),并检索整数数组的元素[i]

然而,所有这些都是不必要的复杂,因为指针的单元素数组与单个指针几乎相同。您也可以将aofp声明为指向int 数组的指针:

int (*aofp)[3];

现在我们看到aofp的类型与ptoa的类型完全相同。您也可以跳过aofp并直接打印ptoa指向的数组:

for (i=0;i<3;i++)
  printf("%d",(*ptoa)[i]);
putchar ('\n');

当然,aofp可能会在以后声明有多个元素。

选项2

您需要将指针指向指定给aofp[0]。由于ptoa指向数组的指针,因此取消引用它会导致指向 int 的第一个元素 strong>数组。 (实际上结果是 array-of-int 的表达式,但是你不能在C中有数组值,所以它会立即转换为指向int的指针即可。)

int *aofp[1];

aofp[0] = *ptoa;

for (i=0;i<3;i++)
  printf("%d",aofp[0][i]);
putchar ('\n');

并且,与前面的示例一样,单元素数组相当无用。你不妨写一下:

int *aofp;

aofp = *ptoa;

for (i=0;i<3;i++)
  printf("%d",aofp[i]);
putchar ('\n');

或者直接打印arr[i]

最后的注释

您可能已经注意到我在最后添加了putchar ('\n')来电。原因是C程序可能不会产生任何可见的结果,除非它以换行结束。

答案 1 :(得分:3)

好的,除了评论中的输入错误外,你可以开始一切顺利;但是之后你会在某些时候开始做无效的操作,特别是在这一行:

int *aofp[1];

实际上这本身就很好。您正在使用此语句正确声明一个名为aofp的变量,作为指向具有单个元素的整数的指针数组。但是,下一行:

aofp[1]=ptoa;

看起来你真的不想将它作为一个带有单个元素的指向整数指针的数组声明,而是作为一个指针数组,指向具有三个元素的整数数组只有一个元素。这是因为,后者用斜体表示的是ptoa正是如此。

另一个重要的事情是C中的数组是从零开始的,这意味着如果在声明期间声明一个大小在方括号内表示的数组,则元素将从[0]索引到{{1所以你应该做如下的任务:

[size - 1]

但这只是在我提到正确宣布aofp[0]=ptoa; 之后。

以下代码将是您的代码的完全更正版本,而不会改变您处理工作的方式:

aofp

对于没有警告/错误进行编译的代码,虽然它可能违反了某些规则,但可以进行以下最小的更改:

  1. 风险自负。
  2. #include<stdio.h> int main( ) { int i; int arr[3] = {1, 2, 3}; int(*ptoa)[3]; ptoa = &arr; // previously was: int *aofp[1]; int(*aofp[1])[3]; // aofp is declared as an /* 1 2 3 4 */ // array of 1 (3) // pointer to (2) // array of 3 (4) // integers (1) // previously was: aofp[1] = ptoa; aofp[0] = ptoa; for (i = 0; i<3; i++) // previously was: printf("%d", **aofp[i]); printf("%d", (*aofp[0])[i]); return 0; // should be there in C } aofp[1]=ptoa;
  3. aofp[0] = (int *) ptoa;在printf内部**aofp[i]
  4. 应该这样做,但我不推荐它。

答案 2 :(得分:1)

这正是你想要的:

int main()
{
     int i;
     int arr[3]={1,2,3};// integer array with 3 integers
     int *ptoa = arr;// ponter to an array
     int *aofp[1]; // this is array of pointer
     aofp[0]=ptoa;   // here i am sotring pointer to an array

     for(i=0;i<3;i++)
         printf("%d",*aofp[0]+i);
}

答案 3 :(得分:0)

这是你想要做的(http://coliru.stacked-crooked.com/a/f342849a8018de37)吗?

/* note- ptoa is pointer to an array
aofp is array of pointer */

#include<stdio.h>

int main()
{
     int i;
     int arr[3]={1,2,3};    // integer array with 3 integers
     int* ptoa = arr;       // pointer to an array

     int* aofp[3];          // this is array of pointer
     aofp[0] = ptoa;        // here i am storing pointer to an element of array
     aofp[1] = ptoa+1;      // here i am storing pointer to an element of array
     aofp[2] = ptoa+2;      // here i am storing pointer to an element of array

     /* here i am trying to print all element of arr[3]
        using aofp i.e array of pointer*/

     for(i=0;i<3;i++)
         printf("%d", *aofp[i]);  
}