首页 > 代码库 > 理解指针,和指针的指针
理解指针,和指针的指针
理解一个事物的最好方式,就是知道它的用途。
我对指针的理解总结起来就是一句话:如果你调用函数的时候,改变一个变量的值(包括基本变量、结构体、类,指针),那么你就需要它的指针。
由于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**。
理解指针,和指针的指针
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。