zoukankan      html  css  js  c++  java
  • 区分int *p[4]与int (*p)[4]

    1、int(*p)[4];------ptr为指向含4个元素的一维整形数组的指针变量(是指针)
    2、int *p[4];-------定义指针数组p,它由4个指向整型数据的指针元素组成(是数组)
    3、int(*)[4];--------实际上可以看作是一种数据类型。也就是第一个(int(*p)[4];)中定义的p的数据类型
    其实你要看这种到底是什么,就是要看他最先和谁结合。 比如1中p先与*结合,那就说明p本质是一个指针;而2中p先与后面的[4]结合,说明他本质是一个数组。再慢慢理解
    数组不赋初值的话是没有值的,其他地方就不能引用这个数组的值,因为他本身没有值。这个和全局变量不一样,全局变量不赋值是默认0。
    数组不赋初值的话是没有值的,都是未知的垃圾数据。你可以写个程序尝试一下!
    #include <stdio.h>
    int main()
    {
    int i;
    int a[10];
    for(i=0;i<10;i++)
    printf("%d ",a[i]);
    }
    int(*p)[4] 是一个指向4个整形数数组的指针 
    int*p[4]是一个有4个指针的数组,该指针是一个指向一个整型数的。
    这个在c语言里是难点,初学时很容易混淆,不过你先找变量,然后先往右看,如果遇到圆括号(一般是圆括号,而且是右半边,如果是左半边就说明它是一个函数)就往左,比如第一个p先往右,然后遇到括号,所以往左看到*,证明他是一个指针,是一个指向整形数数组的指针。第二个,p向右,是一个数组,是一个有4个指针的数组


    int *p[4]中定义的p是有4整型指针的数组

    int(*q)[4] q是指向具有4个整型元素的数组的指针!
    用法
    int f[10];
    int x[4],y[4],z[4],w[4];
    int a,b,c,d;
    int *p[4] ={&a,&b,&c,&d};
    p[0]= &a;p[1]=b;p[2]=&c;p[3]=&d;



    int *p[4] ={x,y,z,w};

    p[0]= x;p[1]=y;p[2]=z;p[3]=w;

    //*(p[0]+1) == x[1]
    p[0]+1 == x+1;

    都是可以的;
    初始化:
    int(*q)[4] ={&a,&b,&c,&d};//不可以int(*)[4]与int* [4]不兼容;
    int(*q)[4] ={x,y,z,w}; ;//不可以int(*)[4]只是一个指针;

    int(*q)[4] =x ; //不可以 q 是int(*)[4]; x是int* 不兼容;

    int(*q)[4] =&x ; //q,&x 都是 可以int(*)[4] ;
    int(*q)[4] =&f ; // 不可以q 是 int(*)[4],&f是int(*)[10];不兼容

    赋值:
    q =x ; //q 不可以 q 是int(*)[4]; x是int* 不兼容;

    q ={&a,&b,&c,&d};//不可以int(*)[4]与int* [4]不兼容,不可以这样赋值;

    q ={x,y,z,w}; ;//不可以int(*)[4]只是一个指针,是个4个整型元素数组的指针;
    //{} 内是int *[4] 是个int *指针的数组
    q =&x ; //可以q,&x 都是 int(*)[4] ;
    q =&f ; // 不可以q 是 int(*)[4],&f是int(*)[10];不兼容
    *q 是个四个元素的数组
    (*q)+1 数组第一个元素的地址
    (*q)[1] 数组第一个元素一般情况,定义一般指针就可以了!
    数组指针作用不是很大,因为对数组的引用通常是不包括数组长度的,
    参数传递时长度要另外传递进来。
    而数组指针把长度固定死了。不适宜传给函数。
    而C又没有可变数组,数组指针只能指向定长数组。所以很少使用。
    实际上只要看到,那种写法,能够理解就可以了!
    真正是用的都是一般的指针和指针的指针
    也就是一级,二级和多级指针
    二级以上使用的也很少!
    倒是函数的指针用的还多些!
    所以只要理解指针本身的概念就够了,指针就是带类型的地址!
    可以通过这个地址获得地址中的值 ( *p )!
    变量和数组(变量族)都有一个地址,
    &用于获取该地址
    * 用于取指针所指地址中的值。

    变量赋值,是向该地址存入所赋的值,
    赋值给别的变量是
    把该地址中的变量的值
    存入另一个变量的地址中,
    所以可以通过地址本身存取变量的值
    指针的值是一个地址,通过指针的值( 就是该地址)可以读写地址中的值。
    如果是函数指针,可以调用函数(函数名本身就是函数指针)。
    这就是指针的用途。
    指针也有地址他的地址可以付给高一级的指针
    一级指针的地址可以赋值给二级指针
     1 int (*p)[4]
     2 p是一个指针,指向 int[4] 数组
     3 
     4 
     5 int main()
     6 {
     7     int a[4];
     8     int b[3][4];
     9 
    10     int (*p)[4];
    11 
    12     p = &a;
    13     p = b;
    14 
    15     return 0;
    16 }
  • 相关阅读:
    C#中Dictionary<TKey,TValue>排序方式
    反射之取类中类的属性、变量名称及其值
    程序测试用的IE浏览器第二次无法加载入口程序的问题及其解决方法
    使用Windows Form 制作一个简易资源管理器
    如何查看自制词典的执行效率
    cocos2dx 3.12 eclipse编辑器切换到Android Studio
    Cordova安装使用
    Activity的启动模式
    踩坑集锦——MVC权限验证
    设计模式学习之路——策略模式
  • 原文地址:https://www.cnblogs.com/herizai/p/3131320.html
Copyright © 2011-2022 走看看