我无法知道(int *)的用法

时间:2013-09-15 18:04:50

标签: c

我无法知道为什么在2d数组的情况下我们必须使用类型转换(int *)? 我想知道的另一件事是,为什么我们不能使用*(*(p+i)+j))来访问以下代码中的2d数组?是否总是需要使用p + col*i + j?当*(*(p+i)+j))包含数组的基地址且p等同于*(*(p+i)+j))时,为什么我不能使用a[i][j]

提前谢谢。

main()
{
    int a[3][4] = {
        1,2,3,4,
        5,6,7,8,
        9,0,1,6
    };

    int *p,i,j;
    p=(int *)a;       // this is my doubt why did we use int *
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++) {
            printf("%d",*(*(p+i)+j));   // here is my 2nd doubt
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您的代码甚至无法编译,正是您的第二个疑问所在。我已经纠正了它:

#include <stdio.h>                                                  
int main(int argc, char *argv[])                                    
{                                                                   
    int a[3][4] = {                                                 
        1,2,3,4,
        5,6,7,8,                                                  
        9,0,1,6,
    };                                                              

    int *p, i, j;                                                   
    p = a[0];       // No cast, just address the 1st row
    for (i = 0; i < 3; i++) {                                       
        for (j = 0; j < 4; j++) {                                   
            printf("%d", *(p + 4*i + j));   // corrected pointer arithmetic
        }                                                           
    }                                                               
}                                                                   

指针p不知道它正在寻址一个2-dim数组,它只是一个int指针。 你确定要打印数字而不用空格分隔它们吗?

答案 1 :(得分:1)

您提供的代码由于行而无法编译:

printf("%d",*(*(p+i)+j));

你要解除引用两次int *

您可以创建一个指针来引用指向4个元素数组的类型指针的数组a。 请参阅附带的代码,其中在执行嵌套for循环期间打印出所有指针。

#include<stdio.h>

main()
{
    int a[3][4]={
        1,2,3,4,
        5,6,7,8,
        9,0,1,6
    };

    int (*p)[4],i,j;
    p = a;
    for(i=0;i<3;i++){
        printf("row pointer: %p\n",p+i);
        for(j=0;j<4;j++){
            printf("element pointer: %p\n", (*(p+i))+j );
            printf("element: %d\n",*( (*(p+i)) + j ) );
        }
    }
}