A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cherrycool 中级黑马   /  2015-11-26 19:53  /  1727 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

3、 指针

3.1  指针与地址

在计算机中,内存是以字节为单位的连续存储空间,每一个字节都有一个编号,这个编号称为地址。
(1)任何变量在其生存期内都占据一定数量的字节。
(2)内存单元的地址与内存单元的内容是不相同的。
(3)一个变量的内存地址称作该变量的指针。

3.2  指针和指针变量

变量的内存地址就是变量的指针。指针变量顾名思义,就是用来存放内存地址的变量,也就是用来存放指针的变量。

3.2.1  指针变量的定义

假设p变量用来存放字符型变量所占用的存储单元的首地址,同时,假定已用某种方式将字符型变量a所占用的内存单元的首地址赋给了p变量,那么,想通过变量p取得字符变量a中的内同,可以按照以下步骤进行:
(1)根据变量p所占用的内存单元的首地址,读取其中所存放的数据,该数据就是字符变量a所占用的内存单元的首地址。
(2)根据第一步取出来的地址以及字符变量所占用的存储单元的长度,读取字符变量a的值。
指针变量定义的一般形式为:
类型说明符 *标识符;
一般变量的定义形式为:
类型说明符  标识符;
int *a;   //该指针变量指向数据为整型数据

float *b;   //该指针变量指向数据为浮点型数据
用变量的地址给指针变量赋值,要求变量的类型必须与指针变量的类型同。我们这样为指针变量赋值:
int b;
int *a=&b;

int *a;
a=&b;

int *p;

p=null;
实例1如下:

#include
void main()
{
int a=5,b=3;
int *x,*y; //定义两个指针变量
x=&a,y=&b;
printf("a=%d,b=%d\n",a,b);
printf("*x=%d,*y=%d\n",*x,*y);

}


3.2.2  指针变量的引用

&:取地址运算符。作用是获取变量的地址。形式为:&变量。例如:&a是获取变量所占内存空间的首地址。
*: 取内容运算符。作用是取指针变量指向的内容。形式为:*指针变量名。例如:*p表示指针变量所指向内存单元中的数据。
(1)将指针变量指向被访问的变量(先指向)
P=&a;
(2)访问所指变量(再取值或赋值)
取值:b=*p;
赋值: *p=10;
注意:如果在一个表达式中同时出现“&”和“*”,一定要小心的分析该表达式。“&”和“*”两个运算符的优先级别相同,但按自右而左的方式进行结合。例如:&*a;很明显的,a是一个指针变量,按照自右而左的顺序进行结合,首先取a指向的变量,然后再对该变量取地址,结果仍然是a。

乘法运算符“*”与取内容运算符“*”书写方法相同,但是这两个运算符是完全不相同的,两者之间没有任何联系。同样,位运算符“&”与取地址运算符“&”之间也没有任何联系。
实例2如下:
#include
void main()
{
int i=3,j=5; //定义整型数据i,j
int *p,*q; //定义整型指针变量p,q
p=&i,q=&j; //为p、q赋值
float a=5.8,b=7.9; //定义浮点型数据a,b  
float *c,*d; //定义浮点型指针变量c、d
c=&a,d=&b; //为c、d赋值
char m='I',n='l'; //定义字符型变量m、n
char *x,*y; //定义字符型指针变量x、y
x=&m,y=&n; //为x、y赋值
printf("i=%d,j=%d\n",*p,*q);
printf("a=%f,b=%f\n",*c,*d);
printf("m=%c,n=%c\n",*x,*y);
}


3.2.3  指针的运算

指针变量同普通的变量一样,可以进行多种运算。对指针变量可以进行赋值运算、取地址运算、取内容运算、加减算术运算、关系运算。
1.&和*运算
&和*运算符的优先级同++ -- !等运算优先级别相同。并且是自右向左的结合方式。
*(++p)   p的地址先加1然后取值
*++p     取地址p加1后的值
*(p++)   先取p的值,然后p指针加1
*p++    先取p的值,然后p指针加1
++(*p)  先取p的值,然后值加1  
实例3如下:
#include
int main(int argc, const char * argv[])
{
    int a,b,c;        //定义三个整形变量
    int *pa,*pb,*pc;
    pa=&a;
    pb=&b;
    pc=&c;    //定义了三个指向整型数据类型的指针,并分别赋值
    scanf("%d%d",pa,pb);     //格式化输入1和2
    printf("%d,%d\n",*pa,*pb);//   1   2
    c=a+b;
    printf(",%d\n",*pc);//  3
    *pc=a+*pb;
    printf(",%d\n",c);// 3
    c=*pa**pb;
    printf(",%d\n",*pc);// 2
    c=++(*pa)+(*pb)++;
    printf(",%d\n",c);// 4
    c=(*pa)++ +*pb++;
    printf(",%d\n",c);//5
    printf(",%d,%d\n",a,b);  // 3 , 3
    return  0;

}


2.赋值运算
赋值运算的一般形式为:指针变量=指针表达式
(1)可以将一个指针变量的值赋给相同类型变量的一个指针变量。例如:
int a,*b,*c;
b=&a;
c=b;
(2)可以将数组的首地址赋值给指针变量。例如:
int a[10],*b;

b=a;
3.算术运算
(1)指针变量与整数相加、减
将指针加上或减去某个整数值,表示将指针向前或向后移动n个数据单元。如:
int a[5],*b,*c;
b=&a[1];
c=b+2;
(2)指针变量的自增、自减运算
变量自增、自减的一般形式为:
p++,p--,++p,--p
其中p为指针变量。

4.关系运算

指针变量之间的关系运算与一般变量之间的关系运算方式是相同的。

5 个回复

倒序浏览
感谢分享。。。
回复 使用道具 举报
内容充足,,,解释明了
回复 使用道具 举报

整理了一下笔记,加深印象
回复 使用道具 举报
IPswhatb“is” 发表于 2015-11-26 23:33
内容充足,,,解释明了

一起学习,共同进步
回复 使用道具 举报
学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马