C语言指针理解(一)

我觉得C语言中指针是最难的,看了几遍书还是不好理解,但指针确是非常重要的

一:指针含义

通过地址能够找到所需的变量单元,也就是说指针指向变量单元。

将地址形象化称为指针,也就是通过它能够找到地址的内存单元:

复杂类型说明:

原则:从变量名处起,根据运算符优先级结合,一步一步向下分析

  1. int p; //这是一个普通的整型变量 
  2. int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针 
  3. int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组 
  4. int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高 ,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组 
  5. int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针。

指针和指针变量理解:

指针:指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。

注:指针是一个地址,指针变量是存放地址的变量

二:指针变量

定义指针变量

类型名*指针变量名

例:int *pointer_1,int *pointer_2;

其中int是在定义指针变量时指定的基类型,指针变量的基类型用来指定指针的变量可以指向的变量类型。基本数据类型(如:float,int,char等),即指类型的变量,也可以指指向这些类型的指针

例;

float*pointer_7;    //pointer_7是指float型变量的指针变量,简称float指针

char*pointer_5;   //pointer-5是指向字符型变量的指针变量,简称char指针

其中:int*pointer_2=&a,*pointer_3=&b;      //定义指针变量pointer_2,pointer_3,分别指向a,b

注:(1)指针变量前面*表示该变量为指针型变量,指针变量名是pointer_1,pointe_2

(2)在定义指针变量时必须指定基类型。&a包含变量a的位置,还包括存储数据是整型的信息,如:

int a,*p;

p=&a;

(3)一个变量的指针含义:一是一存储单元编号表示的纯地址,二是指向存储单元的数据类型(如char,float,int等)

(4)如何表示指针类型,指向整型数据的指针类型便是int*,为int指针

(5)指针变量中只能存放地址,不要将一个整数赋给一个指针变量

引用指针变量

(1)给指针变量赋值:指针变量p的值是变量a的地址,p指向a

p=&a;    //把a的地址赋给指针变量p

(2)引用指针变量指向的变量:

如果已执行“p=&a;”,即指针变量指向整型变量a则:

printf("%d",*p);

其作用是以整型形式输出指针变量p所指向的变量的值,即变量a的值

例:*p=1;

表示将1赋给p当前所指向的变量,如果p指向变量a,相当于把1赋给a

(3)引用·指针变量的值:

printf("%o",p);

作用是以八进制数形式输出指针变量p的值,如果p指向了a,就是输出a的地址,即&a

注:(1)&    取地址运算符        &a表示变量a的地址

(2)*   指针运算符     *p表示指针变量p指向的对象

例:输入a和b两个整数,按小到大输出a和b

 输出结果:

指针变量·作函数参数

函数参数可以是整型,浮点型,字符型等数据,还可以是指针类型,其作用是将一个变量的地址传达给另一个函数中。

例:通过函数调用得到n个要改变的值,则:

(1)在主调函数中设n个变量,用n个指针变量指向他们

(2)设计一个函数,有n个指针形参,在这个函数中改变n个形参的值

(3)在主调函数中调用这个函数,在调用时将这个n个指针变量作实参,将相关变量的地址传给该函数的形参

(4)在执行该函数时,通过形参指针变量,改变他们所指向n个变量的值

看着有点复杂,来一个实例好叭。。。。

输入三个整数a,b,c要求按从大到小的顺序输出

输出结果:

分析:利用exchange函数对3个数按大小进行排列,在exchange函数过程中嵌套swap函数,swap函数作用是对两个数按大小排列

三:通过指针引用数组 

3.1数组元素指针

一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,他们都有相应的地址,指针变量可以指向变量,也可以指向数组元素,数组元素的指针就是数组元素的地址

int a[5]={2,4,6,8,10};    //定义a为包含5个整型数据的数组
int*p;                    //定义p为指向整型变量的指针变量
p=&a[0];                 //把a[0]元素的地址赋给指针变量p

引用数组元素可以引用下标法(a[3]),也可以引用指针法:通过指向数组元素的指针找到所需的元素

注:数组名代表数组中的首元素的地址,下面两个语句等价

p=&a[0];   //p的值a[0]的地址

p=a;     //p的值是数组a的首要元素(即a[0]的地址)

3.2引用数组元素时指针的运算

加一个整数(用+或+=)如:p+1;

减一个整数(用-或-=)如:p-1;

自加运算,如:p++,++p;

自减运算,如:p--,--p;

说明:

(1)如果指针变量p已指向数组中的一个元素,则p+1指向同意数组中的下一个元素(p+1是加上一个数组元素所占用的字节数),p-1指向同一数组中的上一个元素。

(2)如果p的初值为&a[0],则p+i和a+i就是数组元素a[i]的地址,也就是指向a数组序号i的元素

(3)*(p+i) 或*(a+i)是p+i和a+i所指向的数组元素,即a[i]

(4)指针变量p1和p2指向同一数组中的元素,如执行p2-p1,结果是p2-p1的值除以数组元素的长度

注:[]实际上是变址运算符,即a[i]按a+i计算·地址,然后找出地址单元中的值

两个地址不能相加,如p1+p2是无实际意义的

3.3指针引用数组元素

数组元素指针

下标法:如a[i]形式

指针法:如*(a+i)或*(p+i)。其中a是数组名,p是指向数组元素的指针变量

分析:

p++;
*p

    p++使p指向下一个元素a[1].然后若再执行*p,得到下一个元素a[1]的值

*p++;

    由于++和*同级优先级,结合自右而左,他等价于*(p++),先引用p的值,实现*p的运算,然后使p自增1 

(1)*(p++):先取*p的值,然后使p加1,若p的初值a(即&a[0]),若输出*(p++),得到a[0]的值

(2)*(++p):先使p加1,再取*p  ,若p的初值a(即&a[0]),输出*(++p),得到a[1]的值     

(3)++(*p).表示p所指向的元素值加1,如果p=a,则++(*p)相当于++a[0],若a[0]的值为3,则在执行++(*p)(即++a[0])后a[0]的值式4.注:是元素a[0]的值加1,而不是指针p的值加1 

(4)如果p当前指向a数组中第i个元素a[i],则:

*(p--)相当于a[i--],先对p进行*运算,再使p自减

*(++p)相当于a[++i],先使p自加,再进行*运算

*(--p)相当于a[--i],先使p自减,再进行*运算

例:用指针变量指向数组元素

 输出:

例:通过指针变量输出整型数组a的10个元素

         

输出结果:

用数组名作函数参数                                                                                                           

以变量名和数组名作为函数参数比较
实参类型变量名数组名
要求形参类型变量名数组名或指针变量
传递的信息变量的值实参数组首要地址
通过函数调用能否改变实参的值不能改变实参变量的值能改变实参数组的值

 说明 :调用函数采用值传递方式,当变量名作为函数参数时传递的是变量的值,当用作数组名作为函数参数时,由于数组代表数组首元素地址,所以传递的值是地址,要求形参为指针变量                                                                                                                                                                                                                                                                                                     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值