我该如何处理数组指针?

时间:2011-09-07 07:22:13

标签: c pointers operator-keyword

此程序正确打印所有阵列输出。但是这个程序是如何工作的呢?为什么我们需要s[i]这里的地址?

#include <stdio.h>

int main(){
        int s[4][2] = {{1234,1},{1233,2},{1232,3},{1331,4}};
        int (*p)[2];
        int i,j,*pint;

        for(i=0;i<4;++i){
                p = &s[i];
                pint = (int*)p;
                printf("\n");
                for(j=0;j<=1;++j)
                        printf("%d ",*(pint+j));
        }
        return 0;
}

3 个答案:

答案 0 :(得分:2)

int (*p)[2]是指向int [2]类型的指针,它本身基本上是int *类型,但在数组边界上有一些额外的类型检查。

因此,在p = &s[i];中,您将p设置为指向数组s[i]所在内存区域的指针的地址。

使p也成为一个数组(即,“本质上”指向内存中具有附加机制的区域的指针)要容易得多,然后直接使用它来指向数组内存区域({ {1}})。但是,在这种情况下,这正是p = s[i](作为真正的指针)正在做的事情,因此我们可以完全删除pint

所以:

p

请参阅Arrays and pointers或google查看“C数组和指针”以及Pointer address in a C multidimensional array

注意,我假设您只是这样做以了解指针和数组如何交互,所以我不评论在每种情况下使用指针算法或数组概念是否理想。


另请注意,我说一个数组“本质上是一个指针[...]”,但是,这并不是严格正确的,它在很多情况下就像一个指针,而且大多数情况下这是一个合理的方式来思考事情是如何运作的。实际上,阵列以特殊方式处理。请参阅Is array name equivalent to pointer?Arrays

答案 1 :(得分:1)

#include <stdio.h>

int main(){
        int s[4][2] = {{1234,1},{1233,2},{1232,3},{1331,4}};
        int (*p)[2];
        int i,j,*pint;

        for(i=0;i<4;++i){
                p = &s[i];
                pint = (int*)p;
                printf("\n");
                for(j=0;j<=1;++j)
                        printf("%d ",*(pint+j));
        }
        return 0;
}

这里p被定义为一个可以存储两个整数值的数组

 int (*p)[2];

在外部for循环中,我们使用p数组来存储4 {1维}。一次1个。

 p = &s[i];

在第一次迭代中它将是

p = &s[0] ;
i.e p = {1234,1}

下一次迭代将是

 p = &s[1] ;
i.e p = {1234,2}

等等。这就是为什么我们需要&amp; S [i]

内环 只需迭代一维数组就可以打印元素

答案 2 :(得分:1)

唉。我不确定这个代码应该说明什么,而不是如何使易于理解的代码难以理解。

s是由int组成的2元素数组的4元素数组。也就是说,对于0..3中的is[i]的类型为int [2](在大多数情况下衰减为int *),{{1}的类型是&s[i]

int (*)[2]是指向p的2元素数组的指针。每次循环时,int都会在p分配2元素数组的地址。

最后,s[i]是指向pint的简单指针,每次循环都设置为指向int指向的数组中的第一个元素。 p是写*(pint + j)的漫长道路。

请注意,pint[j]p 完全是多余的;这基本上是一种冗长的写作方式

pint