美文网首页程序员
C指针(4):指针传递和返回数据

C指针(4):指针传递和返回数据

作者: miamendax | 来源:发表于2020-05-26 18:47 被阅读0次

    指针传递和返回数据

    1.交换数据

    //实际参数发生改变
    void swapWithPointers(int* pnum1,int* pnum2)
    {
        int tmp;
        tmp = *pnum1;
        *pnum1 = *pnum2;
        *pnum2 = tmp;
    }
    
    //实际参数不发生改变
    void swap(int numl,int num2)
    {
        int tmp;
        tmp=num1;
        numl=num2;
        num2=tmp;
    }
    

    2.返回指针

    int* allocateArray(int size,int value)
    {
        int* arr=(int*)malloc(size * sizeof(int)); 
        for(inti=0;i<size;i++){
            arr[i]=value; 
        }
        return arr;
    }
    
    int* vector =allocateArray(5,45);
    for(inti=0;i<5;i++){
        printf("%d\n",vector[i]);
    }
    

    3.局部数据指针

    int* allocateArray(int size,int value)
    {
        int arr[size]; 
        for(int i=0;i<size;i++){
            arr[i]=value;
        } 
        return arr;
    }
    
    //可以通过将局部数据改为静态数据来解决
    static int arr[size];
    

    4.传递指针的指针

    void allocateArray(int **arr,int size,int value)
    {
        *arr=(int*)malloc(size * sizeof(int)); 
        if(*arr!=NULL){
            for(inti=0;i<size;i++){
                *(*arr+i)=value;
            }
        }
    }
    
    int *vector=NULL; 
    allocateArray(&vector,5,45);
    
    //只传递一个指针不会起作用
    void allocateArray(int *arr,int size,int value)
    {
        arr=(int*)malloc(size * sizeof(int)); 
             if(arr!=NULL){
                 for(inti=0;i<size;i++){
                     arr[i]=value;
                 }
             }
    }
    

    5.自定义free函数

    void saferFree(void **pp){
        if(pp!=NULL && *pp!=NULL){
            free(*pp);
            *pp=NULL;
        }
    }
    
    //宏定义,省去了函数使用者做类型转换和传递指针的地址
    #define safeFree(p)saferFree((void*)&(p))
    
    int main() {
        int *pi;
        pi = (int*) malloc(sizeof(int));
        *pi = 5;
        printf("Before: %p\n",pi);
        safeFree(pi);
        printf("After: %p\n",pi);
        safeFree(pi);
        return (EXIT_SUCCESS);
    }
    //假设malloc返回的内存位于地址1000,那么这段代码的输出是1000和0。第二次调用safeFree宏给它传递NULL值不会导致程序终止,因为saferFree函数检测到这种情况并忽略了这个操作
    

    相关文章

      网友评论

        本文标题:C指针(4):指针传递和返回数据

        本文链接:https://www.haomeiwen.com/subject/wcgvahtx.html