C语言.多级指针

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

int main()
{

    long aa = 123;

    long aaa = &aa;
    // warning: initialization of ‘long int’ from ‘long int *’ makes integer from pointer without a cast
    // 这里,编译器会识别出来&ff是 'long int *', 不是 ‘long int’


    puts("普通变量和指针变量的调用:");
    long * bb = &aa;
    long aaaa = *bb;
    long ** cc = &bb;
    printf( "aa=%ld, aaaa=%ld, bb=%ld, &bb=%ld(cc=%ld),*bb=%ld",
        aa,
        aaaa,
        (long)(bb),     // bb是一级指针,需要转换
        (long)(&bb),    // &bb是二级指针,需要转换
        (long)(cc),     // cc是二级指针,需要转换
        *bb             // *bb=&aa, 调用*bb就是使用bb中存放的ip地址, 和直接调用aa是一回事,不需要转换
        );

    long *** dd = &cc;
    long **** ee = &dd;
    long ***** ff = &ee;

    long * gg = &ff;
    // warning: initialization of ‘long int *’ from incompatible pointer type ‘long int ******’
    // 这里,编译器会识别出来&ff是 'long int ******', 不是 ‘long int *’

    printf("\naa: %ld",aa);
    printf("\naaa: %ld",aaa);
    // aaa 存进取的是指针, 但是声明为long int, 所以这里直接打印为%ld没有任何错误。

    printf("\nbb: %ld",bb);
    printf("\ncc: %ld",cc);
    printf("\ndd: %ld",dd);
    printf("\nee: %ld",ee);
    printf("\nff: %ld",ff);
    // warning: format ‘%ld’ expects argument of type ‘long int’, but argument 2 has type ‘long int *****’
    // 这些全都被警告,因为都是指针,不能当作%ld输出


    printf("\ngg: %ld",(long)(gg));
    // 这里gg也是指针,但是被转换类型后也没问题。

    puts("\n\n");
    return 0;

}

posted @ 2023-08-04 12:46  etfolin  阅读(7)  评论(0编辑  收藏  举报