指针的学习

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指针。

抽象出模式/范式:

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值