指针二

指针与地址

计算机中,内存是以字节为单位的连续存储空间,每个字节都有一个编号,这个编号称为地址。由于内存的存储空间是连续的,所以地址也是连续的。就像教学楼的每个教室都有编号一样。在地址所标志的内存单元中存放数据,相当于教室中的学生一样。
    内存单元的地址与内存单元的内容是不相同的。定义这样的一个变量`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);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值