一种特殊的变量
这种变量只是用来存放内存地址的,起名为指针变量
假设定义了一个只存地址的变量p
把变量a的地址赋予指针变量p,则指针变量p的值为1245052。
当访问变量a时,访问的是什么?5
当访问指针变量p时,访问的是什么?1245052
当访问变量时,为“直接存取(直接访问)"
我们也可以通过指针变量间接的访问该地址中原来的值。此时称为“间接存取(间接访问)"
定义指针变量的一般形式如下:
类型名 *指针变量名;
或
类型名 *指针变量名1,*指针变量名2..…;
例:
int *pi;
int *pj,*pa;
说明:
1.pi,pj,pa都是变量,不过都是指针变量,定义时在普通变量名的左边加上星号就行了。
2.pi,pj,pa三个指针变量的类型为整型,说明三个变量中只能存放int类型变量的地址。
这时我们称int是指针变量pi,pj,pa的基类型。
例:
double *pd;
char *s1,*s2;
pd的基类型为double类型,在指针变量pd中,只能存放double类型变量的地址。
s1和s2的基类型为char类型,在指针变量51和s2中,只能存放char类型变量的地址。
指向指针的指针
例:
int **p,k,*s=&k;
p=&s;
例:若有以下程序
#include <stdio.h>
main()
{int **k,*a,b=100;
a=&b;k=&a;
printf("%d\n",**k);
程序的输出结果是(B)
A.运行错误
B.100
C.a的地址
D.b的地址
例:
int k,*q,*p;/*k为整型变量,q和p都是指针变量。*/
k=1; /*给普通变量赋值*/
q=&k; /*整型变量k的地址赋值给指针变量q*/ p=q;/*将q的值赋值给p*/
例:若有定义:int x,*pb;
则正确的赋值表达式是()
A.pb=&x 正确,该变量为指针变量存放x的地址
B.pb=x 错误,pb是指针变量不可存放整型数据
C.*pb=&x 错误,将x地址赋值给一个pb指向的一个内存区域内的东西,若int *pb=&x
则正确,不在定义语句中,*为访问符号,定义语句中*只是告知计算机这个变量为指针变量。
D.*pb=*x 错误
解析:
*pb
在定义语句中和定义语句外的含义是不同的,比如int *p=&a
中的*p
指的是p这个变量,只不过是比较特殊的指针变量,而脱离了定义语句的*p
的含义是访问p指针变量所指向的内存的区域内的东西
第八章-地址和指针(二)
8.3给指针变量赋值
给指针变量赋“空”值
除了给指针变量赋地址值之外,还可以给指针变量赋一个特殊的值,该值为“空”值
int *p;
p=NULL; //第一种办法
int *p;
p=0; //第二种办法
int *p;
p='\0'; //第三种办法
注意:
此时,指针变量p中不是没有值,而是有一个“空”值。
8.4对指针变量的操作
通过指针来引用一个存储单元,“间址运算符"*
#include <stdio.h>
main()
{
int k,*q,*p;
k=1;
q=&k;
p=q ;
printf("%d\n%d\n%d\n",k,*q,*p);
// 答案为:1 1 1
//*p找到p存储的地址指向的那个空间,并把空间中的值拿出来。
间址运算符说明
1.*与&是逆运算
2.在指针变量已经存有某一变量地址时,可以利用
“*变量=值”的形式给指针变量指向的内存空间赋值
int k=10, *p=&k;
*p=12; //此时k的值变化为12
3.关于++、--号对指针变量的运算★
例:++*p代表++(*p) 取出那个值后进行++即可
★ *p++代表 *(p++)
int *p=&a //假设a的地址为1002,且p为整型指针变量
*(p++) // p++的地址为1006(因为整型4个字节),所以*(p++)为取出地址为1006的空间内的值
空间的值++就必须使用:如果在右边使用自增或者自减符号,必(*p)++
想给地址++就不用括号
例:用指针指向两个变量,通过指针运算选出值最小的那个数
#include<stdio.h>
main()
{
int a,b,min,*pa,*pb,*pmin;
pa=&a; pb=&b;pmin=&min;
scanf("%d%d",pa,pb); //pa, pb 本身就是地址变量不需要加&符号,等价于scanf("%d%d",&a,&b);
printf("a=%d b=%d\n",a,b);
*pmin=*pa;
if(*pa>*pb)*pmin=*pb;
printf("min=%d\n",min);
}
移动指针
所谓移动指针就是对指针变量加上或减去一个整数,或通过赋值运算,使指针变量指向相邻的存储单元。
形式:
指针变量+整型常量
指针变量+整型变量
指针变量p(基类型为int)为1004,p+4的地址为1004+4*4=1020
i=4,p+i的地址为1020
假定在内存中开辟了如图所示的五个连续的、存放int类型整数的存储单元。
并分别给它们取代号为:a[0]、a[1]、a[2]、a[3]、a[4]。
这些代号所代表的存储单元中,分别有值为:
11、22、33、44、55。p指向a[0]所在地址,p++代表a[1]
指针比较
if(p<q)
printf("p points to lower memory than q.\n");
else
printf("q points to lower memory than p.\n");
if(p==\0')printf("p points to NULL\N");
通常两个或多个指针指向同一目标(如同一存储单
元时候)比较才有意义。