int i=5;
int *p;
p=&i;
P为变量,是I的地址。*p的含义为:以p内容为地址的变量。
要想在子函数中交换主函数a,b的地址,则可以通过指针来实现。
#include <stdio.h>
void swap(int * a,int * b)
{
int t;
t=*a;
*a=*b;
*b=t;
return;
}
int main()
{
int a,b;
a=3;
b=5;
swap(&a,&b);
printf("a=%d,b=%d\n",a,b);
return 0;
}
直接通过传入a,b的值来修改是不行的,子函数的参数是存储在静态存储区的,子函数结束的时候,子函数分配的形参空间会被释放,无法return给主函数。
直接传入a,b的地址,把地址赋值给p,q,p指向a,q指向b; 但不能修改a和b。*p=a,*q完全等于b,修改*p,*q就能修改主函数a和b的值。
指针就是地址,地址就是指针,地址就是内存单元的编号;指针变量是存放地址的变量
叙述时会把指针变量简称指针
int * p; 语句:p是变量名,int * 代表的是存放int变量地址的类型
int j,i=5; p=&i;j=*p; p保存i的地址,p指向i ;*P完全等于I ;修改i的值不会改变p的值,修改p的值也不会修改I的值
*p就是以p内容为地址的变量
地址为十六进制,0x 一个字节为8位,内存条存的是8位11111111
函数使用完毕,给函数分配的静态空间会释放。函数的参数也会分配空闲的空间
指针的用途:
1. 使函数返回多个值
1) 返回数组
2) void pop(int *a,int n)//直接修改原数组的值
2. 表示一些复杂的数据结构
3. 直接访问硬件
4. 快速的传递数据
5. 方便处理字符串
6. 理解面向对象语言的引用基础
指针的分类
1. 基本类型的指针
2. 指针和数组
a) 如果P是一个指针变量,则p[i]永远等价于*(p+i)
b) 一维数组:用指针需要两个参数 首地址和长度
3. 指针和函数
4. 指针和结构体
5. 多级指针
地址为非负整数。一个单元等于一个字节,0或者1。每个单元8位
32根总线 2的32次方,2的30次方为1G。32根线的状态为0或1
int *p;int i=5;*p=i;错误:分配了地址变量p和int变量i的空间,但是*p是p地址指向的值,但是没有给p赋值,那p原来的值是垃圾值,有可能指向其他程序,把i赋值给*p,其他程序可能会奔溃,相当于修改其他程序的地址,病毒就是这个原理