c/c++指针

指针

  1. 意义
  2. 声明
  3. 赋值
  4. 运算
  5. 注意

1.指针实际上是一个地址常量,区别与指针变量

2.一个指针的声明必须声明指向的类型,意义是定义清楚它的指向的数据类型,也就是定义了其运算方法 

3.指针定义之后必须先赋值才能引用,因为每个内存空间都有电信号而且它是不确定的,如果直接引用可能造成系统故障,或者数据丢失

  指向常量的指针

//指向常量的指针 
int main()
{
int a ;
const  int * p1 = &a;
}

 指针类型的常量

//指针类型的常量
int main()
{
int * const p2 = &a;
p2=&b;//错误

4.指针的运算规则和所指向的类型有关

5.指针变量相等是其值和指向的类型相同,不同类型指针变量 或 指针与非0整数之间关系运算无意义,可以和整数0比较, 当为0/NUll时表示空指针

重点:指针和数组

C语言二维数组以及用指针操作相对于一组数组而言有些复杂,这里尝试通过类比的方式快速理解。

首先我们要理解一组数组以及其指针操作方法。比如定义数组:int a[10],则a为数组第0个元素的地址,即:a ==&a[0];a+1表示 a[1]的地址,即a+1 == &a[1],依次类推有:a+i == &a[i]。等式两边同时进行取值操作,则有 *(a+i) == a[i]。即对于数组中的任一元素a[i],可以通过 *(a+i)来取得。这时我们如果再定一个指针:int *p = a,则p等效于a,也是数组第0个元素的地址,然后就可以用p来代替a操作,即:a[i] == *(p+i)。图示如下:

假如我们把几个一维数组放一起,如下图如示,有3个数组,数组名分别p0、p1、p2,没有任何问题。p0、p1、p2也分别代表三个数组的第0个元素的地址。这时我们再把p0、p1、p2放到一个数组中,数组名叫pp,也没有任何问题。这时二维数组就表示出来了:pp[3][4]。pp是二维数组的数组名,3表示里面有3个元素,每个元素都是一个地址,该地址是一个一维数组的第0个元素地址,4表示每个一维数组有4个元素。

跟一维数组一样,我们用二维数组的数组名对数组元素进行操作。假如我们要表示出下图中红色的那个元素即pp[1][2],首先要找出它所在的数组的首地址,为p1。所以pp[1][2] == *(p1+2)。而p1怎么得到呢?p1在数组pp中,先找到该数组的首地址pp,则p1==*(pp+1),把p1代进去,就有:pp[1][2] = *( *(pp+1) +2 )。对于任意元素,有pp[i][j] == *( *(pp + i) + j )。

我们再定义一个指针来代替数组名pp吧。怎么定义呢?能不能 int *p =pp呢?不行,因为 int *p中的p移动一次(即加1)是移动1个int字节,而从图中看出pp移动一次走4个int字节,所以类型不匹配,不能这样定义。怎么定义一次走4个int字节的指针呢?我们假设C语言作了这样的规定,就用:int (*p)[4]来表示。其中*p代表p是指针,int [4]代表类型。这样就可以有: int (*p)[4] = pp。推广开来,对一个二维数组type a[M][N],它的指针定义格式是:type (*p)[N] = a;其中任意元素a[i]

[j] == *( *(p + i ) + j)。

假如你认为 int (*p)[4]这个定义难以理解,非要用一个简单的指针来定义,这个指针为a[0][0](下图中蓝色元素)的地址,即:int *p = &pp[0][0],如下图所示。这时如何用指针p代表pp[1][2]即那个红色元素呢?关键还是要找到红色元素所在的数组首地址即p1。可以看出,p0移动4个位置(即一个数组的长度)就会到达下一个数组的首地址p1,即:p1 == p0 + 1*4,找到了首地址,就有:pp[1][2] == *(p1 + 2) ==  *( (p0 + 1 * 4) + 2);所以对于任意二维数组a[M][N],如果定义 *p = &&a[0][0],对于任意元素a[i][j],有:a[i][j] == *( a[i] + j) == *( ( p+ i * N) + j) 。

指针和其他的结合

  1. 数组:指针数组
  2. 函数:指针作为函数参数
  3. 对象

1.指针数组 

int main()
{
int * p[3]
}

2 .指针与函数

2.1.指针作为函数参数 

 意义:对数据进行原内存空间的直接操作,而不是通过函数开辟新的内存运算后再返回

2.2.指针作为函数返回值(指针型函数)

2.3.指向函数的指针

总结:各种运算符号优先级导致运算顺序不同,产生不同的用法,本质是声明时的运算符优先级和结合性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薄了代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值