指针(复习)

一.指针

1.概念:简单的说,指针就是地址
变量的地址就是该变量的指针
存放地址的变量称为指针变量
指针变量的值是具有实际值的变量的地址。
2.左值
左值之所以被称为左值是因为出现在赋值号的左边的不是变量,而是一个数值,是表达式的结果:

  • a[0]=3;

  • *p=5;

  • 是特殊的值,所以叫做左值
    3.指针运算符
    &:取地址运算符
    *:指针运算符

    *&p  -> * (&p) ->*(p的地址)->得到的那个地址上的变量->p
    
    &*p->&(*p)->&(x)->得到x的地址,也就是p->p
    

    (简单记忆&跟 * 在一块可以消去)

二.指针的使用

1.定义指针变量
定义形式:数据类型 *指针变量名;
eg:char *p;
其中p是指针变量名,它是指向字符型的指针变量。
可以定义指针的同时为它初始化eg:
int i=5;
int *pi=&i;
NOTE:
(1)定义语句“int *pi”,定义pi为指针变量,pi的值是地址,可以使用&运算符作用与变量对pi进行赋值,使其指向一个变量。
(2)在定义指针变量时,要明确其所指向变量的数据类型,而且所指向的变量的数据类型应与指针变量定义是的数据类型一致。
(3)指向相同类型的指针变量之间可以相互赋值
(4)在使用指针变量之前若不确定其指向,为了防止系统随意赋值,可将指针变量赋值为NULL。eg:
int *pi;
pi=NULL;
2.指针的应用
首先要知道指针的作用是能够实现间接访问
(1)函数需要返回多个值,某些值需要用指针带回(交换数值)
(2)通过间接访问改变变量的值。

三. 指针与数组

指针与一维数组

1.一维数组元素的地址
&a[i]其中i=0,1,2,3……表示数组a下标为i的数组元素地址。
2.指向一维数组的指针变量
eg:
int a[5];
int *pa;
pa=a(pa=&a[0]);
C语言中规定数组名代表数组首元素的地址这段代码使得指针变量pa指向了数组a的首元素a[0],也可以在同时定义指针变量的同时初始化。
eg:int *pa=a;
或int *pa=&a[0];
3.引用数组元素时指针的运算
**只有在指针变量指向数组元素时,指针变量进行运算才有意义。可以使其指向数组中其他元素。
eg:
int a[5],n;
int *pa = a;
int qa ;
qa= pa+2;
qa++;
qa–;
n=qa-pa;
(1)"qa= pa+2"指的是向高的地方移动2倍的int的字节数,即移动2个数组元素,移动后qa指向a[2];
(2)"qa++"在(1)的基础上向高的地方再移动一个数组元素,此时qa指向a[3];
(3)"qa–"同理此时qa指向a[2]
(4)"n=qa-pa"此语句是用于计算qa所指的元素与pa所指的元素之间有多少个元素。此时n=2。两个指针变量相间的含义是两个地址之间差除以每个数组元素所占的字节数。
4.引用一维数组元素
(1)使用下标引用一维数组
eg:a[0],a[4],a[8]……
(2)通过数组的首地址引用一维数组的元素
eg:int a[5];
但由于数组名代表数组元素的首地址,a即为&a[0],则a+1就是&a[1];利用指针运算符
a就表示a[0], *(a+1)就是a[1];
(3)通过指针变量引用一维数组
eg:
int a[5] ,i;
int *pa=a;
则 * (pa+i)就等于a[i]
(4)使用带下标的指针变量引用一维数组元素
eg:
int a[5] ,i;
int *pa=a;
可以用pa[i]表示a[i].
所以当pa指向a数组首元素时,数组元素a[i]的地址表达式有以下四种:&a[i] a+i pa+i &pa[i]
对应的数组元素a[i]的表达式有四种:
a[i] *(a+i) *(pa+i) pa[i]

这里a是指针常量其数组不能改变;pa是指针变量,其值可以改变。

指针与二维数组

1.二维数组元素的地址
二维数组中每个元素的地址可以通过每行的首地址来表示;由C语言中规定数组名代表数组首元素的地址即,a=&a[0];a[i]=&a[i][0],可以得到每个元素的地址可以通过每行的首地址a[0],a[1],a[2]来表示。例如,&a[0][0]可以用a[0]+0来表示,&a[0][1]来表示,&a[1][2]可以用a[1]+2来表示。
2.a[i][j]的地址的几种形式

  • &a[i][j]
  • a[i]+j
  • *(a+i)+j
  • &a[0][0]+4*i+j(第i行第j列元素地址)
  • a[i]+4*i+j(第i行第j列元素地址)
    3.二维数组元素a[i][j]的几种形式
  • [i][j]
  • *(a[i]+j)
  • *( * (a+i)+j)
  • ( * (a+i))[j]
  • *(a[0][0]+4 *i+j)

通过指向二维数组元素的指针变量引用二维数组元素
int a[3][4];
int i, j;
int *p=a[0];
p是指向整型元素的指针变量。a[0]为&a[0][0],使p指向a[0][0],
所以p的值为&a[0][0]。则p+1是使p指向下一个元素等价于a[0]+1(即&a[0][1])
通过p引用a[i][j]可以写 成 下形 式: *(p+4 *i+j)等 级 于 *(&a[0][0]+4 * i+j)

(指针中重要的是要理解数组名代表数组首元素的地址

未完待续……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值