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:
理解数组和指针-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 Int5Type[5]; //类型1
typedef int Int6Type[6]; //类型2
数组本身不是类型,只有跟个数关联才有意义。
二维数组传参问题 add by RYF 2011-6-21
讨论:数组作为函数传参有个隐式转化,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类型元素数组 的指针,同样需要传行数,