1. 基本概念
指针是一种变量,只不过里面存放的是地址的变量,不管是一级指针还是二级指针里面都是存放的变量。 指向变量的指针叫做指针变量,但是人们都习惯了叫做指针(一级指针);指向指针的指针叫做二级指针,所以还有指向指针的指针的指针等等,多级指针,在目前我所遇到的问题中,只用到了二级指针,因此这里至总结到二级指针。为了便于维护,实际在做项目开发的时候,我们很可能只有到一级指针。
1.1 一级指针
int a =5;
int *p = &a;
- int *p中的*表示p是一个指针变量(简称指针),p中存放的是地址;
- int *p中的int表示p指向int型的数据;
- 总结:指针变量p本质上也是变量,该变量是int* 型的,但p中存放的是int型变量的地址,或者说指针变量p指向int型的数据;(这句话通俗理解:指针存放的是比他本身低一级的变量的地址)
- 注意:通常说的“指向”,表示的意思是存放这种数据的地址。
1.2 二级指针
2. 指针做形参
指针作为形参传递过去的是实参的拷贝,只是说他们指向同一块内存地址。就是说,当指针做形参时,会在栈空间开辟一个新的内存空间,里面存放的内存是实参的内容,实参和形参中的内容指向同一个数。
void fun( int* var_p )
{
printf("形参var_p为%p\n", var_p);
printf("形参var_p的地址为%p\n", &var_p);
}
void main(void)
{
int a = 10;
int* p = &a;
fun(p);
printf("p为%p\n", p);
printf("p的地址为%p\n", &p);
system("pause");
}
结论:指针作为形参传递过去的是实参的拷贝,只是说他们指向同一块内存地址。本质上的联系如下图所示:
在我们的实际项目中,关于形参指针的应用就是做输入int *p_in输出int *p_out,我们通常希望输入指针不能改变其指向,只能利用指向的值做运算。而在输出中,我们希望输出的指针指向我们希望输出的地址,所以这里有两种方法,第一,p_out的指向不变,但是指向地址中的值发生了改变,对应于在程序中需要操作*p_out,第二种方法,改变p_out的指向,即给p_out赋新值。
#include<stdio.h>
void fun1(int *p1)
{
int b=100;
p1=&b;
}
void fun2(int *p2)
{
*p2=100;
}
main()
{
int a=10;
int *q;
q=&a;
printf("%d/n",*q);
fun1(q); //fun2(q);
printf("%d/n",*q);
return 0;
}
这个时候fun()中打印出来的tmp值就是1了,因为我们此时传进来的是tmp的地址,所以我们在change()中tmp_t就是tmp的地址了,而对于*tmp_t的操作其实就是对tmp的操作了。
到这里的时候我们可以试想一下,我们通过传递指针来达到修改一个值的目的,那么当你需要修改一个指针的时候呢,这个时候我们就需要指针的指针了,如下:
int fun(void)
{
int *buf ;
int ret ;
ret = mem_init(&buf);
return ret;
}
int mem_init(int **buf_t)
{
*buf_t = malloc(100);
return 1;
}