指针

指针

由于内存中的每一个字节都有一个唯一的编号,因此,在程序中使用的变量,常量,甚至数函数等数据,当他们被载入到内存中后,都有自己唯一的一个编号,这个编号就是这个数据的地址。指针就是这样形成的地址就是存放区中每个字节的区号,例如 1000 1001,1002,1003,10004。

指针的值实质是内存单元(即字节)的编号

  1000,1001等就是内存单元的地址,而0就是内存单元的内容,也就是说,基本整型变量i从在内存的地址从1000开始,因为基本整型占4个字节,所以变量j在内存的地址从1004开始。

指针变量

  存放地址的变量称为指针变量。指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。

 

 定义指针变量的一般形式如下:

类型名*指针变量名1

 变量的地址是变量和指针之间的的纽带,如果一个变量包含了另一个变量的地址,那么第一个变量就可以说是指向第二个变量。所谓的"指向“就是通过地址实现的,在程序中用“*”符号表示“指向”。因为指针变量是指向一个变量的地址,所以将一个变量的地址赋给这个指针变量后,这个指针就“指向了”该变量。例如,将变量i的地址存放到指针变量p中,p就指向i,。

	int i;
        int *p;
	printf("Please input\n ");
	scanf("%id",&i);
        p=&i;
	printf("%d\n",i);
        printf("%d\n",*p);
	system("pause");

赋值变量的赋值

int a;

int *p;

p=&a;

如果在定义完指针变量之后再赋值注意不加“*”。

运算符   *    和   &

& 取地址符       &a 就获取了a的指针,然后我们就可以用int*p变量出承接这个地址    p = &a; 我们就说p指向了a

* 解地址符       *操作符有一个很形象的动词  :解  。p保存了a的起始地址和延续宽度,那么,*p则是确定起始地址,量出宽度,

                     获取这个内存块。 因此我们可以通过a 的地址p去操作(读/写)这个内存块了。

指针解决了一些编程中基本的问题。

第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果,但是这样往往效率不太好,因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能。但使用指针就可以很好的避免这个问题,因为任何类型的指针占用的字节数都是一样的(根据平台不同,有4字节或者8字节或者其他可能)。

第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。我们防止这个目标数据被改变。传递指针只是为了避免拷贝大型数据。

考虑一个结构体类型Student。我们通过show函数输出Student变量的数据。

typedef struct
{
    char name[31];
    int age;
    float score;
}Student;


//打印Student变量信息
void show(const Student * ps)
{
    printf("name:%s , age:%d , score:%.2f\n",ps->name,ps->age,ps->score);   
}

第三,有些操作必须使用指针。如操作申请的堆内存。还有:C语言中的一切函数调用中,值传递都是“按值传递”的,如果我们要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。

#include<stdio.h>
void swap_bad(int a,int b);
void swap_ok(int*pa,int*pb);

int main()
{
    int a = 5;
    int b = 3;
    swap_bad(a,b);       //Can`t swap;
    swap_ok(&a,&b);      //OK
    return 0;
}

//错误的写法
void swap_bad(int a,int b)
{
    int t;
    t=a;
    a=b;
    b=t;
}

//正确的写法:通过指针
void swap_ok(int*pa,int*pb)
{
    int t;
    t=*pa;
    *pa=*pb;
    *pb=t;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值