概述
指针
由于内存中的每一个字节都有一个唯一的编号,因此,在程序中使用的变量,常量,甚至数函数等数据,当他们被载入到内存中后,都有自己唯一的一个编号,这个编号就是这个数据的地址。指针就是这样形成的。地址就是存放区中每个字节的区号,例如 1000 1001,1002,1003,10004。
指针的值实质是内存单元(即字节)的编号
1000,1001等就是内存单元的地址,而0就是内存单元的内容,也就是说,基本整型变量i从在内存的地址从1000开始,因为基本整型占4个字节,所以变量j在内存的地址从1004开始。
指针变量
存放地址的变量称为指针变量。指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。
定义指针变量的一般形式如下:
类型名*指针变量名1
变量的地址是变量和指针之间的的纽带,如果一个变量包含了另一个变量的地址,那么第一个变量就可以说是指向第二个变量。所谓的"指向“就是通过地址实现的,在程序中用“*”符号表示“指向”。因为指针变量是指向一个变量的地址,所以将一个变量的地址赋给这个指针变量后,这个指针就“指向了”该变量。例如,将变量i的地址存放到指针变量p中,p就指向i,。
int i;
int *p;
printf("Please inputn ");
scanf("%id",&i);
p=&i;
printf("%dn",i);
printf("%dn",*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:%.2fn",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;
}
最后
以上就是大气野狼为你收集整理的指针指针的全部内容,希望文章能够帮你解决指针指针所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复