指针的概念
指针也是一个变量
指针存放的内容是一个地址,该地址指向一块内存空间
指针变量的定义
可以定义一个指向一个变量的指针变量。
int *p;//表示定义一个整型的指针变量。
*p;///间接访问符/解引用,代表指针所指内存的实际数据
指针变量只能存放地址,不能将一个int型变量直接赋值给一个指针。
int *p = 100;
&取地址运算符
&可以取得一个变量在内存当中的地址
无类型指针
定义一个指针变量,但不指定它指向具体哪种数据类型。可以通过强制转化将void *转化为其他类型指针,也可以用(void *)将其他类型指针强制转化为void类型指针。
void *p
NULL
NULL在C语言中的定义为(void *)0
指针之间赋值比普通数据类型赋值检查更为严格,例如:不可以把一个double * 赋值给int *
指向常量的指针与指针常量
const char *p;//定义一个指向常量的指针
char *const p;//定义一个指针常量,一旦初始化之后其内容不可改变
指针与数组的关系
一个变量有地址,一个数组包含若干个元素,每个元素在内存中都有地址。
int a[10];
int *p = a;
通过指针使用数组元素
p + 1代表&a[1],也可以直接使用p[1]表示a[5]
p + 5 代表&a[5]
p++
指针数组
int *p[5];
指向指针的指针(二级指针)
指针就是一个变量,既然是变量就也存在内存地址,所以可以定义一个指向指针的指针。
int i = 10;
int *p1 = &i;
int **p2 = &p1;
printf("%d\n", **p2);
以此类推可以定义3级甚至多级指针。
指针变量做为函数的参数
函数的参数可以是指针类型。,它的作用是将一个变量的地址传送给另一个函数。
数组名作为函数参数
当数组名作为函数参数时,C语言将数组名解释为指针
int func(int array[10]);
int a=10;
int b=20;
int *p=&a;//&a a的地址,a的指针
//int *p 定义整型的指针变量
*p=100;//间接访问符/解引用,把a的值赋值为100
p=&b;
int **pp=&p;
*pp=&a;
**pp=1000;
*pp=&b;
**pp=2000;
void Swap1(int a,int b)
{
int tmp=a;
a=b;
b=tmp;
}
子函数进行交换,没有对主函数造成影响
void Swap2(int *p1,int *p2)
{
int *tmp=p1;
p1=p2;
p2=tmp;
}
没有解引用
void Swap3(int *p1,int *p2)
{
int *tmp; //野指针,悬挂指针
//tmp没有初始化
*tmp=*p1;
*p1=*p2;
*p2=*tmp;
}
野指针
void Swap(int *p1,int *p2)
{
int tmp;
tmp=*p1;
*p1=*p2;
*p2=tmp;
}
子函数的改变影响父函数的改变
- 1、传指针
- 2、解引用