指针的学习

    技术2022-05-20  67

    1,基本类型

    char *pc,  pc+offset <=>  pc + sizeof(char)*offset

    int *pi,     pi+offset <=>  pi + sizeof(int)*offset

    float *pf,  pf+offset <=>  pf + sizeof(float)*offset

    double *pd,     pd+offset <=>  pd + sizeof(double)*offset

     

    2,自定义类型

    struct my_struct { };   my_struct* ps,  ps+offset <=> ps + sizeof(my_struct)*offset

     

    3,指向指针的指针

    int i=5;

    int *pi = &i;

    int **ppi = π 

    [**ppi == *pi == i]

     

    4,指向数组的指针:编译器需要知道指向的数组的长度

    int array[5] = {1,2,3,4,5};

    int *pi = array;  //pi为指向整数的指针,指向数组第一个元素  pi == &array[0];

    pi+1 = &array[1];  //pi + 1 实际移动一个整数,四个字节

     

    int (*pa)[5] = &array;  //pa 为指向数组的指针, int(*pa)[5]为指向5个元素数组的指针类型,编译器知道数组的大小为5.

    pa + 1 越界操作。

     

     

    int mat[2][5] = {1,2,3,4,5, 6,7,8,9,10};  //两个5元数组

    int (*pa)[5] = &mat[0];  // pa指向了mat中的第一个5元组

    assert( **(pa+1)==6 );  // pa+1指向了mat的第二个5元组。

     

    add - 2011/3/17

    指向数组的指针定义:

    typedef int pInt5Type[5];  //通过typedef定义了一个类型: pInt5Type,指向五个整型元素数组的指针。

    int array[5] = {1,2,3,4,5};

    pInt5Type  pA = &array; // 错误,

    纠正 - RYF 2011/5/26:

    typedef int pInt5Type[5]; //通过typedef定义了一个类型: pInt5Type,指向五个整型元素数组的指针。 typedef pInt5Type* Ptr; int array[5] = {1,2,3,4,5}; Ptr pA = &array; 

    理解数组和指针-2011/5/26

    C++是基于范式(Paradigm)/模式(Pattern),泛型编程就是提取、提升出特定的范式或者模式,独立于类型,最终以统一的模板形式实现,模板又是支持特化的,模板从技术角度阐释了共性和特性。模式和范式一直停留在理论层面。。扯远了~ 我主要想说一下数组和指针,这个永恒的话题,数组到底怎么理解,我从范式角度做个比较、分析:

    针对特定类型的分析,最熟悉的int:

    double  d_a(5.0); //任何型别不论内建还是自定义,都支持圆括号初始化/构造

    double  d_aa = d_a; //定义int变量,赋值, 注意operator= 只是赋值的一种形式,字符串赋值必须strcpy

    double*  p_a = &a; //取地址符号&,赋给double指针。

    抽象出模式/范式:

    type t_a : 初始化操作;  // : 表示初始化

    type t_aa := 赋值操作; // := 表示赋值

    type* p_a := "t_a"; // " "表示取地址,地址然后赋值操作

    验证:

    typedef int type; 自定义类型也都成立。。。

     

    typedef int type; type t_a = 0; type t_aa = t_a; type* pt_a = &t_a; 

     

    对于数组的验证:

    //通过typedef定义了一个类型: pInt5Type,五个整型元素数组的类型。 typedef int Int5Type[5]; typedef Int5Type* Ptr; Int5Type array = {1,2,3,4,5}; //Int5Type的初始化 Int5Type array1; memcpy(array1, array, sizeof(int)*5); // Int5Type的赋值 int (*parray)[5] = &array; // Int5Type指针的赋值 Ptr parray1 = &array; // Int5Type指针的赋值

    可见,数组也是满足这个范式的,只不过数组类型的赋值和初始化有点特殊,取地址还一样。

    数组究竟是什么?数组是一个函数,由类型、个数决定确定。如果抽象到跟类型无关的范式,唯一决定数组的就是个数。不同的个数对应不同类型。。。 

    typedef int Int5Type[5]; //类型1

    typedef int Int6Type[6]; //类型2

    数组本身不是类型,只有跟个数关联才有意义。

     

    二维数组传参问题 add by RYF 2011-6-21

    帖子链接:http://topic.csdn.net/u/20110621/11/91f21f8e-371d-40ef-b080-44d9c40e2795.html?seed=413382482&r=73957997#r_73957997

    讨论:数组作为函数传参有个隐式转化,decay的过程,

    void f(const char p[][10], int n) { ... }

    f(p1, 5);  p1是二维数组,于是会被转化为一个 数组指针,什么样的数组指针呢?是指向 有10个char元素数组 的指针。

    10个char元素数组是一个类型,跟个数有关。二维数组转化为数组指针,丢失行数目信息,所以需要增加一个参数n表示行数。

    void f1(const char p[][5], int n) { ... }   f1(p2, 5); 同理p2被decay为 指向 有5个char类型元素数组 的指针,同样需要传行数,

     


    最新回复(0)