我试图区分整数指针和整数数组指针,以及我使用的代码作为示例:
#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,而是必须使用它们的地址。
我的理解是否正确?
答案 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