如何区分整数指针和整数数组指针

时间:2016-01-11 00:49:26

标签: c pointers

我试图区分整数指针和整数数组指针,以及我使用的代码作为示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ZLEN 5
typedef int zipdig[ZLEN] ;
#define UCOUNT 3
typedef int (*row5_pt)[ZLEN];

int main(int argc, char *argv[]) {
    zipdig cmu = {8, 5, 2, 1, 3};
    zipdig mit = {0, 2, 1, 3, 9};
    zipdig ucb = {9, 4, 7, 2, 0};

    int *univ[UCOUNT] = {mit, cmu, ucb};
    int result1 = *univ[1];

    row5_pt pt[UCOUNT] = {&mit, &cmu, &ucb};

    int result2 = (*pt[1])[1];

    printf("\nresult is %d \n", result1);
    printf("\nthe size of dereferenced univ is %lu bytes \n", sizeof(*univ[1]));

    printf("\nresult is %d \n", result2);
    printf("\nthe size of dereferenced pt is %lu bytes \n", sizeof(*pt[1]));


    return 0;
}

起初我对以下两项任务感到困惑:

int *univ[UCOUNT] = {mit, cmu, ucb};
row5_pt pt[UCOUNT] = {&mit, &cmu, &ucb};

这里univ是一个包含3个整数指针的数组,而pt是一个指向5个元素的int数组的指针数组。我的困惑是,在第一个赋值,mit,cmu和ucb中,这些数组标识符被视为指针,但是当涉及到第二个赋值时,为什么mit,cmu和ucb被视为数组,而不是指针?

后来我意识到这是由于我使用的指针类型不同:第一个赋值,univ的元素是一个整数指针,而mit,cmu,ucb被认为是整数指针,但对于第二个赋值, pt的元素是指向数组的指针,而不是整数,因此我们不能直接使用mit,cmu或ucb,而是必须使用它们的地址。

我的理解是否正确?

1 个答案:

答案 0 :(得分:1)

是的,您的理解是正确的。

原因是所涉及的指针的类型&mit是指向数组的指针,而mit(在表达式中)被转换为指向数组第一个元素的指针。

int a[10];
int *p = a; // 'a' decays into a pointer to its first element i.e. &a[0]
int *q = &a[0]; // Equivalent to the above

int (*x)[10] = &a; // &a is of type int(*)[10] i.e. a pointer to an array of 10 ints

另见:What is array decaying?