c语言 指针的指针 用法详解,c语言指针csdn
最近过年在家,大年初一,闲来无事,就把以前看过的书整理了一下,顺手把《C指针的深度理解》这本书重新看了一遍。这本书整体感觉比较简单,但是还有一些地方是我平时没有想到或者注意到的。在这里,我会做一个记录,以便以后需要时可以查看。
1.自实现内存安全释放功能safeFree
为空地址或已经释放内存的地址释放内存,并报告错误。
自实现内存安全释放功能:
void安全免费(void **pp)
{
如果(pp!==NULL *pp!=空)
{
免费(* PP);
* pp=NULL
}
}
具体:
添加宏定义时,调用函数时,不需要显示用于类型转换的宏定义前后两个函数的名称。宏定义只是文本替换的简单预编译。
#包括iostream
#包含malloc.h
使用命名空间std
#定义safe free(p)safe free _ 2((void * *)(p))
void safeFree_2(void **p)
{
如果(p!=NULL *p!=空)
{
免费(* p);
* p=NULL
}
}
int main()
{
int *p,* * q;
p=(int *)malloc(sizeof(int));
safe free(p);
safe free(p);
p=(int *)malloc(sizeof(int));
q=
safe free(* q);
safe free(* q);
返回0;
}
2.指针数组和数组指针
3.函数指针数组
因为函数的地址可以作为函数指针传递,而函数本身不能作为参数传递,所以只有函数指针的数组是不存在的(数组函数指针)。
第一种形式:
typedef int(*operation)(int,int);
操作operations[128]={ NULL };
第二种形式:int (* operations [128]) (int,int)={ null };
#包括iostream
使用命名空间std
typedef int (*fptr)(int,int);
int (*operations[128])(int,int)={ NULL };
int add(int x,int y)
{
返回x y;
}
int减法(int x,int y)
{
返回x-y;
}
void initializeOperationsArray()
{
操作[ ]=添加;
操作[-]=sub;
}
int eval(char操作码,int num1,int num2)
{
fptr操作;
operation=operations[opcode];
返回操作(num1,num 2);
}
int main()
{
initializeOperationsArray();
cout eval(,30,20)endl;
cout eval(-,30,20)endl;
返回0;
}
4.函数指针的互换
typedef int(* fptrToSingleInt)(int);
typedef int (*fptrToTwoInts)(int,int);
int add(int,int);
fptrToTwoInts fptrFirst=add
fptrToSingleInt fptrSecond=(fptrSingleInt)fptrFirst;
fptrFirst=(fptrToTwoInts)fptrSecond;
函数指针类型转换可能会改变指针长度或产生错误,但通常会给出正确的结果。(C/c++多标准,由不同厂商和编译环境决定)
同时,也不能保证函数指针和数据指针相互转换后都能正常工作,比如:
void * pv=add一般来说,基本的函数指针类型可以用于函数指针交换。
typedef void(* fptrBase)();
fptrBase basePointer
fptrFirst=add
base pointer=(fptrToSingleInt)fptrFirst;
fptrFirst=(fptrToTwoInts)base pointer;
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。