指针的学习

来源:互联网 发布:土豆pc客户端mac版 编辑:程序博客网 时间:2024/06/01 08:07

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 = &pi; 

[**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:

 

理解数组和指针-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指针。

抽象出模式/范式:

typet_a : 初始化操作; // : 表示初始化

typet_aa := 赋值操作;// := 表示赋值

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

验证:

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

 

 

 

对于数组的验证:

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

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

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类型元素数组 的指针,同样需要传行数,

 

原创粉丝点击