C语言:指针总结(一:指针与指针变量、指针的操作与运算)

一、指针与指针变量

1.指针变量

T* p
//T *p //p是一个指针 指向T类型 即保存某个T类型变量的地址 

eg: int * iptr = &x;   //iptr1指向int类型变量x (保存x的地址)

上例中,p即为一个指针变量

指针变量:变量的值是内存的地址

普通变量的值是实际的值 指针变量的值是具有实际值的变量的地址

总结来说:指针也是一种变量,用来保存其他类型变量(int ,float,struct等)的地址

一个禁忌:

定义指针变量后没有指向任何变量就开始使用指针

eg:
	int  *p;//必须得到某个变量的实际地址 
	*p = 12;//这步是不可以的 不知道p访问的东西是不是能访问的,更不可能再去改变!!! 

另:指向指针的指针

如果一个指针变量所指向的变量仍然是一个指针变量,那么就构成指向指针变量的指针变量。

可能有点绕,举一个例子,如下图:

p的声明类型为:**p

用如下代码段构造7.15的结构 :

int **p,*s,v;
p = &s;
s = &v;
v = 300;

使用p访问v内容的形式:
*p取p的内容,得到一个指针值,该指针值“指向int类型变量”
**p 即 *(*p),取(*p)的内容,得到int类型的值

 

二.指针的操作和运算

1.介绍两个运算符:

(1)取内容:*

如果放在指针变量前,*用来访问指针(地址表达式)所指变量的内容

*iptr  --->   访问指针变量iptr所指变量的内容
eg:int iptr = 10;
    int j = *iptr;//此时j == 10

如果放在声明中,是指针定义符。

eg:char *pch;
//声明了指向char* 类型的指针变量pch

(2)求地址:&(与*互为逆运算)

用来求“被操作对象”的地址(即指针,eg:&x表示变量x在内存中的存储地址(即x的指针)

若x的地址为ABD0,则&x的值为ABD0。他的具体地址我们并不关心,我们更重视&x是x的指针。

(3)赋值:=

把一个指针值赋给某个指针变量。

int * px,x;
px = &x;//指针px指向变量x 
px = NULL;//为px赋空指针
px = (int*)4800//将地址4800(对应16进制12c0)赋给px,而不是整数类型4800 

 

2.指针运算

首先用指针标识数组:

a.数组名是指针,指向数组的首元素(下标为0的元素)的地址。(不代表整个数组!)

因而可以把这个指针值送入指针变量中。(只是放了首地址,没有把整个数组全部送入!)

int a[5];
int *iptr;
iptr = a;	//或iptr = &(a[0])

//二维数组
int *aptr,a[m][n],x;
//以下等价
aptr = &(a[0][0]);
aptr = a[0];
aptr = *a;

 

b.访问数组,可以用数组名a,也可以用指针变量iptr

iptr = a;
//以下等价 
a[i];
*(a+i);
iptr[i];
*(iptr+i); 

//或
iptr = &(a[2]);
//以下等价
iptr[i]; a[i+2]; *(a+i+2);

//二维数组 按照行优先存储!!
//a[u][v]的地址为:aptr + u*n + v
x = *(aptr + u*n + v);
x = a[u][v];//以上等价

c.数组名是指针常量!对数组名a的增1运算“a++”是非法的

指针运算:

加:(+、++)

a.若指针p指向数组变量a的一个元素,那么 指针p+整数k 依旧是指针值。此时p指向“数组a从p原来所指元素开始,向数组尾部移动k个元素后的元素”

b.两个指针不可以进行加法运算

int *p,*q,a[100];
p = &(a[10]);
p = p+3;//p指向a[13]
q = q+4;//q指向a[17]
p++;//p = p+1; p指向a[14] 

c.一些例子

int a[10],*ptr,v,*q,u;
v = 5;
ptr = &(a[v]);
a[4] = 40;
a[5] = 50;
a[6] = 60;

1)ptr++;
q = ptr++; //q指向a[5],ptr指向a[6]

2)*(ptr++) 和 *ptr++;//*和++优先级相同,结合方向是从右向左,因此二者等价
ptr++是a[5]的地址 
*(ptr++) == *ptr++ == 50;
*ptr = 60;

3)(*ptr)++;
*(ptr) == a[5];
a[5]++ -> 51

4)++ptr
q = ++ptr;
//运算结束后q指向a[6],ptr指向a[6] 

5)*(++ptr) 与 *++ptr//*和++优先级相同,结合方向是从右向左,因此二者等价
u = *(++ptr);
u == 60; 

 

减(-、--)

a.指针值指向数组的一个元素,指针p-整数k 依旧是指针值,表示向数组首部移动k个元素

b.如果两个指针值相容(指向的对象是同一个类型的),可以进行相减运算,得到的结果是整数类型的值,为两个指针值之间的距离。 

int *p,*q,a[100];
p = &(a[10]);
q = &(a[5]);
p-q = 5;
q-p = -5;

 

 判等运算和关系运算

a.判断是否相等(==、!=)

b.比较大小关系(>、>=、<、<=)

px < py 判断px指向的存储单元地址是否小于py所指向的存储单元地址。

px == py 判断px与py是否指向同一个存储单元

px == 0,px!=0,px == NULL,px != NULL 都是判断px是否为空指针

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值