C语言_指针的理解

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;

}

猜你喜欢

转载自blog.csdn.net/zcc_123/article/details/102811024