指针传递和返回数据
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函数检测到这种情况并忽略了这个操作
网友评论