c语言指针

一、指针基础

在计算机内存中,每一个字节单元,都有一个编号,称为地址。内存单元的地址称为指针。专门用来存放地址的变量称为指针变量。

1.指针变量的定义
一般形式:
类型说明符 *变量 指针变量名是*后面的内容不包括*一个指针变量只能指向同类型的变量

2.指针变量的赋值
未经赋值的指针变量不能随便使用。
指针变量的值只能是地址。
指针变量只能存放地址不能将一个整型数据赋给指针。
eg:&p指的是p存放的起始地址

3.指针变量的引用
指针指向的内存区域中的数据称为指针的目标。如果它指向的区域是程序中的一个变量的内存空间,则这个变量称为指针的目标变量。

&:取地址运算符, 取的是变量的地址
*:指针运算符(间接存取运算符), 取的是指针所指向的存储单元里的内容
eg:
p——指针变量,它的内容是地址量
*p——指针所指的对象,它的内容是数据
&p——指针变量占用的存储区域的地址,是个常量

若把一个变量的地址赋给指针(eg:int *p,a=1;p=&a;)意味着指针所指向的内存单元实际上就是存储该变量的内存单元。因此,无论改变指针所指向的内存单元的内容还是直接改变变量的内容效果是一样的。
指针在初始化时未将变量a的地址赋给指针变量p(eg:int *p,a=1,c;p=&c;),那么此后变量a的值并不会被指针改变,a和p的赋值互不干扰。
所以,指针初始化时把变量的地址赋值给它,变量和指针的值一起变,反之各是各的值。

二、指针的运算

1.指针的算术运算
p+n:指针向地址大的方向移动n个数据
p-n:指针向地址小的方向移动n个数据
p++或++p:指针向地址大的方向移动1个数据
p–或--p:指针向地址小的方向移动1个数据
p-q:两个指针之间相隔数据元素的个数

ps:不同数据类型的指针实行加减整数运算是无意义的
p+n表示的实际内存单元的地址量是——>(p)+sizeof(p的类型)*n

2.指针的关系运算
“>”
“<”
“>=”
“<=”
“!=”
“==”
不同数据类型之间运算无意义。
指针与一般整型变量之间的关系运算没意义,但可以和0进行等于不等于的关系运算,判断指针是否为空。

3.空指针
NULL指针,代表0,表明一个指针目前并未指向任何对象。
不可以对空指针进行间接引用操作。通过一个指针访问它所指向对象的值称为变量的间接访问(通过操作符*)
指针不初始化可能发生错误,所以可以指向NULL。eg:int *p=NULL;

三、指针与数组

指针与一维数组
1.数组的指针
数组元素的地址是指数组元素在内存中的起始地址。可以由各个元素加上取地址符&构成。&a[0]就表示数组中的第一个元素的地址。数组名就代表数组的起始地址。(int a[0];a和&a[0]表示一样的东西。)
数组指针是指向数组起始地址的指针,其本质为指针。

2.数组元素的表示
数组名+i——>数组名[i]
在这里插入图片描述
3.指针与多维数组
存储行地址的指针变量,叫做行指针变量。一般形式:
<存储类型> <数据类型> (*<指针变量名>) [表达式];eg:int (*p)[3];
二维数组名和行指针在表达形式上非常类似,本质的区别是数组名是地址常量,地址是变量。

4.多级指针
一个指向指针变量的指针变量,称为多级指针变量。对于指向处理数据的指针变量称为一级指针变量,简称一级指针。而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针。
二级指针变量形式:<存储类型> <数据类型> **<指针名>
二级指针存放一级指针的地址
eg:
int *p;
int **q;
q=&p;

多级指针的运算
指针变量加1,是向地址大的方向移一个数据。这里的数据指的是指针的目标变量。
int **p,p+1移动一格int*变量所占的内存空间。

5.指针数组
定义:指针数组是指由若干个具有相同存储类型和数据类型的指针变量构成的集合。
形式:<存储类型> <数据类型> *<指针变量数组名> [<大小>]

eg:int *p[2];[]的优先级高于*)

指针数组的数组名是数组的起始地址。
由于数组元素是指针,数组名就是数组首元素的地址即数组名是指针的地址,是多级指针了。

6.const与指针
const修饰变量,会使得变量常量化。,修饰指针变量使得指针变量常量化。

(1)常量化指针目标表达式
常量化指针目标是限制通过指针改变其目标的数值。
形式:const <数据类型>*<指针变量名称> [=<指针运算表达式>]

eg:
const int *p;
int m=100;
int n=200;
p=&m;(m=100*p=100,p=&m=0x.....)
*p=n;(*p是常量,不能被修改)

const的作用限制了通过指针去修改指针的目标,但还是可以自己直接修改目标自己的值

(2)常量化指针变量
形式:<数据类型> *const <指针变量名称> = <指针运算表达式>;
指针变量存储的地址值不能修改

eg:
int m=100,n=200;
int * const p=&m;(指针变量存储的地址值不能修改,p和&m一直不会变,*p变m也变)
*p=n;(*p=200)
p=&n;(p不能被修改)

(3)常量话指针变量和目标表达式
形式:const <数据类型> *const <指针变量名> = <指针运算表达式>;

既不可以修改<指针变量>的地址,也不可以通过*<指针变量名称>修改指针所指向的变量的值。

7.void指针
void型的指针变量是一种不确定数据类型的指针变量,它可以通过强制类型转换让该变量指向任何数据类型的变量或数组。
没有进行强制转换之前,void型指针变量不能进行任何指针的算术运算。
形式:void *<指针变量名称>

8.字符指针
(字符串通常是借助字符数组来存储。)
字符指针可以存储字符串的起始地址,即指针指向字符串的第一个字符。

9.字符指针数组
若数组中存储了若干个字符串的地址,则这样的数组就叫做字符指针数组。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值