指针与地址
计算机中,内存是以字节为单位的连续存储空间,每个字节都有一个编号,这个编号称为地址。由于内存的存储空间是连续的,所以地址也是连续的。就像教学楼的每个教室都有编号一样。在地址所标志的内存单元中存放数据,相当于教室中的学生一样。
内存单元的地址与内存单元的内容是不相同的。定义这样的一个变量`int i=3;`假设系统为i分配的内存地址是1001和1002两个内存单元,则i的地址是1001,而i的内容是3.
一个变量的内存地址称为该变量的指针。如果一个变量用来存储指针,则称该变量为指针类型的变量(一般称为指针变量)。如果指针变量a的值等于变量b的地址,则称指针变量a指向变量b,在变量a中存放的是b的地址,这时要访问b所代表的内存单元。
指针变量的引用
1、&:取地址运算符,作为获取变量的地址。例如:&a,获取变量所占内存空间的地址。
2、*:取内容运算符,作用是取指针变量指向的内容。;例如:*p,表示指针变量所指向内存单元中的数据。
3、&a表示变量a的地址,*p表示指针变量b所指向存储单元的内容。
通过指针变量访问所指变量
1、将指针变量指向被访问的变量(先指向)p=&a;
2、访问所指变量(再取值或赋值)。
取值:b=*p;
赋值:*p=100;
实例一、指针变量的应用
#include<stdio.h>
int 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);
return 0;
}
程序分析:分别定义两个整型变量a,b和两个指针变量x,y,x和y只能指向整型变量。然后让x指向a,y指向b,这样在x中存放的是a的地址,y中存放的是b的地址。然后输出a,b的值,然后输出x,y所指向存储单元的内容,有结果可知,x,y指向存储单元内容就是a和b的值。
注意: 如果在一个表达式中同时出现“&”和“*”,一定要小心分析该表达式,“&”和“*”
两个运算符优先级相同,但按照从右到左的方式进行结合。例如:&*a
,a是指针变量,首先取a的指向变量,然后再对该变量取地址结果仍然是a。
指针运算、
#include<stdio.h>
void main()
{
int a=2,*p=&a,*q=&a;
printf("%d,%d",*p++,*(q++));//输出a值
printf("\n");
printf("%d,%d",*p++,*(q++));//输出a的下一个地址所存的值
printf("\n");
a=2;
p=&a;
q=&a;
printf("%d,%d",*p++,*(++q));
}
赋值运算:指针变量=指针表达式
int a,*b,*c;
b=&a;
c=b;
指针变量b就是a的地址,然后将b的值赋值给c,这样c的值也是a的地址,指针变量b和c都指向a。
可以将数组的首地址赋值给指针变量。
int a[10],*b;
b=a;
由于数组名在内存中占据的是一段连续的内存空间,数组名代表数组的首地址,所以可以直接将数组名复制给一个指针变量,注意,在赋值语句中的数组名前不用加“&”取址符。
指针与整数的加减
将指针加上或者减去某个整数值,表示将指针向前或者向后移动n个数据单元,
指针变量的自增自减运算。
p为指针变量,++p与p++后,p指向下一个数据。
同类指针相减的结果是这两个指针之间数据元素的个数。
示例、
#include<stdio.h>
void main()
{
int i,a[5],*x,*y;
for(i=0;i<5;i++)
{
a[i]=i+1;
printf("%d ",a[i]);
}
printf("\n");
x=a,y=&a[3];
printf("%d\n",*x+2);
printf("%d\n",*x++);
printf("%d\n",y-x);
}
y中存放的是第4个元素的地址。
第一个输出的是:x向前移动2个单位的指向内容,因此x+2指向数组的第三个元素3,第二条语句输出的为x自增前的值,执行完语句后x指向下一个 元素,第三条语句,x指向数组的第2个元素,y指向数组的第4个元素,因此y-x表示两个变量之间的元素个数为2。
指针的关系运算
两个指针之间可以进行关系运算,指针变量之间的关系与一般变量之间的关系运算方式是相同的。
例如:求数组元素中元素的和、
#include<stdio.h>
void main()
{
int i,a[5],*x,*y,sum=0;
for(i=0;i<5;i++)
{
a[i]=i+1;
printf("%d ",a[i]);
}
x=a,y=&a[4];
for(x;x<=y;x++)
{
sum=sum+*x;
}
printf("sum=%d\n",sum);
}