标签:style blog http color io java 2014 div sp
理解一个事物的最好方式,就是知道它的用途。
我对指针的理解总结起来就是一句话:如果你调用函数的时候,改变一个变量的值(包括基本变量、结构体、类,指针),那么你就需要它的指针。
由于C/C++ 调用函数的时候,永远都会拷贝一份参数,所以,你怎么折腾都无法改变原来的东西(java对于对象是传引用)。所以,你就需要一个指针,直接改变那个变量的内存内容。贴代码:
#include "stdio.h"
void changeValue(int a, int b);
void changeValuePtr(int* pa,int b);
void changePtrValue(int* pa , int* pb);
void changePtrValuePtr(int* *a ,int* pb);
int main(void)
{
int a = 0 ;
int b = 3 ;
changeValue(a,b);
printf("calling changeValue a = %d\n",a);
changeValuePtr(&a,b);
printf("calling changeValuePtr a = %d \n",a);
a = 0 ;
changePtrValue(&a,&b);
printf("calling changePtrValue a = %d \n",a);
int* ptra = &a;
changePtrValuePtr(&ptra , &b);
printf("calling changePtrValuePtr a = %d \n",a);
printf("calling changePtrValuePtr *ptra %d \n",*ptra);
}
void changeValue(int a , int b)
{
a = b ;
return ;
}
void changeValuePtr(int* pa,int b)
{
*pa = b ;
return ;
}
void changePtrValue(int* pa , int* pb)
{
pa = pb ;
return ;
}
void changePtrValuePtr(int** pa ,int* pb)
{
*pa = pb ;
return ;
}
结果:
如果你想改变a的值,你必须要传入a的指针。如果,你想把a的指针指向b。那你必须传入a的指针的指针。还是刚开头的那句话,如果你调用函数的时候,改变一个变量的值(包括基本变量、结构体、类,指针),那么你就需要它的指针。
我们下面看一个linux的函数int pthread_join(pthread_t th, void **thread_return); 这个函数是等待一个线程返回,第一个参数是线程的id,然后把线程返回的内容放在thread_return。如果你学过java,void*其实可以理解为object,它可以被强制转换为任何的变量(结构体、类、基本变量)。我们在一个线程里可以通过malloc的方式开辟一块内存。在pthread_join函数中,需要把thread_return这个指针指向你开辟的内存。所以,改变一个指针的变量的值,那么我们就需要这个指针的指针。因此,我们调用pthread_join函数时,就要传入一个void**。
标签:style blog http color io java 2014 div sp
原文地址:http://www.cnblogs.com/hepengfei/p/3978027.html