C语言判定指针类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言判定指针类型相关的知识,希望对你有一定的参考价值。
[code=c]
/*
例如:想要实现一个简单购物、销售事件,用一个数组存储购入的动物指针(注意购入的动物顺序不是固定的)。
当销售的时候如何从数组中取出指针后,判断为这个指针的类型并对其操作。
本来想再定义一个数组用来存储指针数组中每一位的指针类型,可不知道如何写
请教高手提供一个简单,便捷的方法。不想在每一次取出指针后,通过switch进行判断。
简易代码如下:
*/
/**定义三个结构体*****************/
//猪->编号
struct Pig
char * Code;
pig;
//猫->年龄
struct Cat
char Age;
cat;
//狗->价格
struct Dog
int Price;
dog;
/**定义一个指针容器,存放结构指针**************************************/
//指针容器,这个容器只存放指针
int DongWu[3];
char DongWuCount;
/**向指针容器中装入指针***********************************/
void Buy(int pointer)
DongWu[DongWuCount]=pointer;
DongWuCount++;
//使用Buy
void BuyIn()
Buy(&cat);
Buy(&dog);
Buy(&pig);
/*从容器中检索出来的时候需要进行结构判断,有什么快捷、灵活的方法?******************************/
void SellAll()
char i;
for(i=0;i<sizeof(Pointer);i++)
u32 pointer=Pointers[i];
/*
这里需要判断 pointer,针对不同的结构,执行不同的操作,
因为DongWu数组里保存的仅仅是一个指针地址,有什么办法快速检索出 结构类型
*/
[/code]
判断一个指针类型:把指针声明语句里面的指针名字去掉,剩下的部分就是这个指针的类型。
你自己在类里加识别记号。(比如每个类里加个int classtypeid;)
使用RTTI技术,用typeid来识别。详细的可以在百度上搜“c++ typeid"或“RTTI",文章很多。
C 语言一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )
一、判定指针合法性
判定指针合法性时 , 必须进行如下判断 , 判断的是 指针指向的地址 是否为 NULL
, 即 是否为 0 地址 ;
int get_value(char *key_value, char *key, char *value, int *value_len)
// 任何函数调用前 , 先判定函数形参正确性
if(key_value == NULL || key == NULL || value == NULL || value_len == NULL)
printf("key_value == NULL || key == NULL || value == NULL || value_len == NULL\\n");
return -1;
不能判断 指针指向的内容是否为 0 , 下面的示例是错误的 :
// 错误示例
int get_value(char *key_value)
// 错误的判定示例
if(*key_value != '\\0')
return -1;
C 语言中的 指针 , 内存 等原理必须知道 , 不知道原理 , 就不会调用指针 ;
Java 语言中都会调用 , 即使 不懂 其中的内存 , 引用 相关的内存 原理 ;
二、数组越界
定义数组变量后 , 为其赋值时 , 赋值的内容 超出了数组的大小 ;
错误示例 : "abc"
字符串需要
4
4
4 字节内存 , 后面第
4
4
4 个字节是 \\0
字符 ;
// 错误示例
char str[3] = "abc";
三、不断修改指针变量值
凡是涉及到修改 指针 变量值时 , 不要直接修改 原来的 指针变量 指向 ;
推荐 创建新的 临时局部指针变量 , 接收该 指针 , 需要修改指针时 , 修改 该 临时局部指针变量 ;
四、函数中将栈内存数组返回
如果在函数中 , 需要 创建一块内存空间 , 返回给调用者 ;
这块在 函数中 创建的内存 , 不能是数组 , 必须使用 malloc
函数 , 在 堆内存 中创建一块内存空间 ;
在 函数内 创建的数组 存储在 栈内存中 , 栈内存的数据 , 在函数结束后 , 其被系统自动回收 , 该内存可能被写入其它数据 ;
五、函数间接赋值形参操作
在函数中 , 如果需要通过 函数的 形参指针变量 通过 间接赋值 返回相关结果 , 这个指针使用时要慎重 ;
建议 创建一个 临时局部指针变量 , 接收该 形参指针 , 需要修改 指针 时 , 修改 临时局部指针变量 ;
六、指针取值与自增操作
对于指针 * 和 ++ 同时操作时 , 如 :
*p++;
特别注意 , 后缀 ++ 操作优先级高 , 先执行 *p 操作 , 然后地址 ++ ;
上述语句执行后 , 指针指向的地址就改变了 ;
对于不确定的操作 , 建议使用 ()
设置操作优先级 ;
将 指针 指向的地址 中存储的 值 自增 : 先取出值 , 然后自增 ;
(*p)++ ;
先将地址自增 , 然后再取值 :
*(p++);
以上是关于C语言判定指针类型的主要内容,如果未能解决你的问题,请参考以下文章
C 语言一级指针 易犯错误 模型 ( 判定指针合法性 | 数组越界 | 不断修改指针变量值 | 函数中将栈内存数组返回 | 函数间接赋值形参操作 | 指针取值与自增操作 )