标签: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