搞笑----容易忘的c基础2

9 篇文章 0 订阅
1. NULL 是宏定义 不是关键字

在一般的头文件 都有包含 若编译过程 报错 则可以自己定义 : #define NULL (void*)0

2.在函数声明的时候 可以 给参数 一个默认值 -------定义的时候不给写 如下:

node( ElemType e,node<ElemType>* link =NULL);
template<typename ElemType>
node<ElemType>::node( ElemType e,node<ElemType>* link)
{
	data=e;
	next=link;
}

3. for(表达式1;表达式2;表达式3)=====for(初始化条件,循环条件,变量改变)

for语句是常用的循环语句 : 今天尝试了在  循环终止区==表达式3  写了一个逗号表达式 程序一直没有正常run

于是怀疑 for表达式中不能用逗号, 开玩笑 记得是可以的 -----原来是循环条件写错了 不会进入循环体 也就不会执行 表示3

程序:用来从链表中 特定节点或取元素的值

template<typename ElemType>
bool LinkList<ElemType>::GetElem(int addr,ElemType& e)
{
    bool ret =0;
    node<ElemType>*p= head;
    int k=10;
    if( (addr >1) && (addr <=length))
    {
     // for(;addr==1;addr--,p=p->next,k--); ERROR addr ==1 will not run for
     for(;addr!=1;addr--,p=p->next,k--);// not {}
            cout<<"k=="<< k<<endl;
       /*    while(addr != 1 )
            {                    
                //p=p->next;
                addr--;        
            }
        */
        e= p->data;
        ret=1;
    }
    return ret;
}

结果:在 纠正 循环条件后 ,表达式3 也就执行了 ,k 是用类似测试 到底有没有进行 逗号表达式的,while的实现和for一样

ct@ubuntu:~/Desktop$ g++ 1.cpp
ct@ubuntu:~/Desktop$ ./a.out 
k==8
get len3
num  1 value 5
num  2 value 3
num  3 value 2
3

4. 以函数指针作为函数的参数 ---我居然 搞不清楚怎么调用了

c中函数的指针的主要作用:起回调 作用  -----这个可以参考关于 函数指针的博客

现在想---函数指针的回调 有点 c++ 中多态的赶脚

:函数指针 指向的是 一类函数 只要类型一致 函数体实现不一样(可以理解是不同的定义)那么调用就会有不同的结果

template<typename ElemType>
void LinkList<ElemType>::traverse(void (*view)(ElemType &e) )        //--------function point argument
{
	assert(!IsEmpty());
	node<ElemType>* p =head->next;
	for(int i=1;i<length;i++)   //from 1 start while( p!=NULL)
	{
		(*view)(p->data);                                   //use the function
		p=p->next;
	}
}

template<typename ElemType>                                         //----------define   
void view(ElemType& e)
{
    cout<<" the current element is "<<e<<endl;
}

 traverse(  ) 遍历函数: 有个参数是 函数指针----指向的函数类型是:    有个EelmType  类型的参数  返回值为void 

只要符合该类型的函数----在  void LinkList<ElemType>::traverse(void (*view)(ElemType &e) )  该函数中 带入实际函数地址(函数名) 就可以实现对应函数的调用

接下来看一下今天的错误:

	int a=0;
  TLINK.traverse(view(a));
      ^
1.cpp:34:25: error: invalid use of void expression
   TLINK.traverse(view(a));

错误:直接在参数的位置调用函数了 ,而且该函数没有返回值 ,即使想隐式类型转换也是不可能的 所以相当与这里是没有参数的

实际上会犯这个错误---说明我对函数参数 和 函数指针 的使用都不 熟悉。

函数是个函数指针 只要传入函数地址即可(就是把要执行的函数 的地址 赋值给参数 ,有个方法:类比成一般的参数就会好理解很多)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值