首页 > 代码库 > 理解指针,和指针的指针

理解指针,和指针的指针

理解一个事物的最好方式,就是知道它的用途。

我对指针的理解总结起来就是一句话:如果你调用函数的时候,改变一个变量的值(包括基本变量、结构体、类,指针),那么你就需要它的指针。

由于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**

理解指针,和指针的指针