欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

指针

程序员文章站 2024-01-01 17:11:16
...

指针

由于内存中的每一个字节都有一个唯一的编号,因此,在程序中使用的变量,常量,甚至数函数等数据,当他们被载入到内存中后,都有自己唯一的一个编号,这个编号就是这个数据的地址。指针就是这样形成的地址就是存放区中每个字节的区号,例如 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;
}

 

上一篇:

下一篇: