程序员

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

2020-05-26  本文已影响0人  miamendax

指针传递和返回数据

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函数检测到这种情况并忽略了这个操作
上一篇 下一篇

猜你喜欢

热点阅读