码迷,mamicode.com
首页 > 其他好文 > 详细

理解指针,和指针的指针

时间:2014-09-17 21:41:52      阅读:171      评论:0      收藏:0      [点我收藏+]

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

  

结果:bubuko.com,布布扣

 

如果你想改变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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!