【温故知新C/C++/opencv】取址符&||cv::groupRectangles||引用与值传递
2015-10-19 11:29
399 查看
cv::groupRectangles
voidgroupRectangles(vector<Rect>&rectList,intgroupThreshold,doubleeps=0.2)¶
Groupstheobjectcandidaterectangles
Thefunctionisawrapperforagenericfunctionpartition().Itclustersalltheinputrectanglesusingtherectangleequivalencecriteria,thatcombinesrectanglesthathavesimilarsizesandsimilarlocations(thesimilarityisdefinedbyeps).Wheneps=0,noclusteringisdoneatall.If
,alltherectangleswillbeputinonecluster.Then,thesmallclusters,containinglessthanorequaltogroupThresholdrectangles,willberejected.Ineachotherclustertheaveragerectanglewillbecomputedandputintotheoutputrectanglelist.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
http://www.nowamagic.net/datastructures/ds_UsageOfAddressOperator.php
viewsource
print?
intb=1;inttest=find(&b);这样调用时,实际上是进行了:int*a=&b,创建了一个新的指向b的整型指针a作为find函数范围内的局部变量。
这样调用时,实际上是进行了:int&a=b,给变量b起了个别名a,也就是说a和b实际上代表的是同一个变量,调用期间没有创建任何新的变量。
这样调用时,实际上是进行了:inta=b,也就是普通的变量赋值操作,调用期间创建了在find函数范围内的局部变量a,它的值与b相同。
*在用于计算时,就是取指针所指向的地址中的值,如intb=*a,就是将整型指针a指向的地址中存放的内容赋值给整型变量b。
C语言中,&符号大家一定很熟悉吧,它除了可以作为按位运算“与”之外还有更常用的功能——取变量地址。
viewsource
print?
上面代码中,指针p指向变量a的地址。在C/C++中,每个变量都有其相应的地址,通过在变量标识符前加&符号即可获得变量的地址。
那么我们这么写可以吗?int*p=&0x01000;
这显然不行。因为对于一个数值常量,它是没有地址的。而变量之所以有地址就是因为要有一个存储单元对变量进行标识(当然,变量也可以直接映射到某个寄存器)。
我们再看下面的代码:
viewsource
print?
上面代码又是怎么回事呢?
先前已经调查过变量a的地址——0x0012ff60,那么这里的指针p实际上也是指向变量a的地址。
首先,将0x0012ff60作为int*,这时它与&a是等价的。
然后*(int*)0x0012ff60表示取变量a的内容。
最后,&*(int*)0x0012ff60表示再脱去*(int*)0x0012ff60的解引用,相当于又变为(int*)&a。
因此,这里的&与第一个例子中的&是不同的语义。这里的&不是取地址,因为一个*(int*)0x0012ff60不是变量,它是没有地址的。每一个变量标识符在编译期间,编译器会为它们创建一个符号表,其中存放着变量标识符相应的各种属性,如类型、地址标识等。地址标识在连接后即可确定逻辑地址值。简而言之,&作为取地址操作,当且仅当&后面跟着的是变量或函数标识符。所以这里的&表示脱去解引用。
由此我们可以得出:&作为取地址操作时,其行为结果是在编译时就被确定的;而*,解引用操作(或取内容)操作,其行为结果只能在运行时才可被确定。
再看下面的例子,加深印象:
viewsource
print?
在C++中,&还可以表示引用,这个就不多说了。
viewsource
print?
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
http://book.51cto.com/art/201009/224192.htm
【答案】
指针是一个实体,而引用仅是个别名;
引用使用时无需解引用(*),指针需要解引用;
引用只能在定义时被初始化一次,之后不可变;指针可变;
引用没有const,指针有const;
引用不能为空,指针可以为空;
"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身(所指向的变量或对象的地址)的大小;
和引用的自增(++)运算意义不一样;
在内存分配上,程序为指针变量分配内存区域,而引用不需要分配内存区域。
感谢:http://blog.csdn.net/pkueecser/article/details/6333179
voidgroupRectangles(vector<Rect>&rectList,intgroupThreshold,doubleeps=0.2)
Groupstheobjectcandidaterectangles
Parameters: | rectList–Theinput/outputvectorofrectangles.Onoutputtherewillberetainedandgroupedrectangles groupThreshold–Theminimumpossiblenumberofrectangles,minus1,inagroupofrectanglestoretainit. eps–Therelativedifferencebetweensidesoftherectanglestomergethemintoagroup |
---|
,alltherectangleswillbeputinonecluster.Then,thesmallclusters,containinglessthanorequaltogroupThresholdrectangles,willberejected.Ineachotherclustertheaveragerectanglewillbecomputedandputintotheoutputrectanglelist.
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C语言中地址操作符&的使用
示例一
01 | #include<stdio.h> |
02 | int find( int *a); |
03 |
04 | main() |
05 | { |
06 | int b=1; |
07 | int wait,test; |
08 |
09 | test=find(&b); |
10 |
11 | printf ( "内存地址为:%d" ,&test); |
12 |
13 | scanf ( "%d" ,&wait); |
14 | } |
15 |
16 | int find( int *a) |
17 | { |
18 | return *a; |
19 | } |
示例二
函数声明:intfind(int&a);函数调用:intb=1;intn=find(b);这样调用时,实际上是进行了:int&a=b,给变量b起了个别名a,也就是说a和b实际上代表的是同一个变量,调用期间没有创建任何新的变量。
示例三
函数声明:intfind(inta);函数调用:intb=1;intn=find(b);这样调用时,实际上是进行了:inta=b,也就是普通的变量赋值操作,调用期间创建了在find函数范围内的局部变量a,它的值与b相同。
C中*、&用法介绍
&在用于计算时就是取变量地址,如int*a=&b,就是将整型变量b的地址取出,赋值给整型指针a,a中的内容就是b的地址,所以a指向b。*在用于计算时,就是取指针所指向的地址中的值,如intb=*a,就是将整型指针a指向的地址中存放的内容赋值给整型变量b。
C语言中,&符号大家一定很熟悉吧,它除了可以作为按位运算“与”之外还有更常用的功能——取变量地址。
01 | #include<stdio.h> |
02 |
03 | main() |
04 | { |
05 | int a=0; |
06 | int wait; |
07 |
08 | int *p=&a; |
09 |
10 | printf ( "Thevalueis:%d/n" ,*p); |
11 |
12 | scanf ( "%d" ,&wait); |
13 | } |
那么我们这么写可以吗?int*p=&0x01000;
这显然不行。因为对于一个数值常量,它是没有地址的。而变量之所以有地址就是因为要有一个存储单元对变量进行标识(当然,变量也可以直接映射到某个寄存器)。
我们再看下面的代码:
1 | #include"stdio.h" |
2 | int main( void ) |
3 | { |
4 | int a=0; //&a=0x0012ff60 |
5 | int *p=&*( int *)0x0012ff60; |
6 | printf ( "Thevalueis:%d/n" ,*p); |
7 | return 0; |
8 | } |
先前已经调查过变量a的地址——0x0012ff60,那么这里的指针p实际上也是指向变量a的地址。
首先,将0x0012ff60作为int*,这时它与&a是等价的。
然后*(int*)0x0012ff60表示取变量a的内容。
最后,&*(int*)0x0012ff60表示再脱去*(int*)0x0012ff60的解引用,相当于又变为(int*)&a。
因此,这里的&与第一个例子中的&是不同的语义。这里的&不是取地址,因为一个*(int*)0x0012ff60不是变量,它是没有地址的。每一个变量标识符在编译期间,编译器会为它们创建一个符号表,其中存放着变量标识符相应的各种属性,如类型、地址标识等。地址标识在连接后即可确定逻辑地址值。简而言之,&作为取地址操作,当且仅当&后面跟着的是变量或函数标识符。所以这里的&表示脱去解引用。
由此我们可以得出:&作为取地址操作时,其行为结果是在编译时就被确定的;而*,解引用操作(或取内容)操作,其行为结果只能在运行时才可被确定。
再看下面的例子,加深印象:
1 | #include"stdio.h" |
2 |
3 | int main( void ) |
4 | { |
5 | int a=0; |
6 | int *p=&*&*&a; |
7 | printf ( "Thevalueis:%d/n" ,*p); |
8 | return 0; |
9 | } |
01 | #include"iostream" |
02 | using namespace std; |
03 |
04 | int main( void ) |
05 | { |
06 | int a=0; |
07 | int &r=a; |
08 | cout<< "Thevalueis:" <<r<<endl; |
09 | return 0; |
10 | } |
【答案】
指针是一个实体,而引用仅是个别名;
引用使用时无需解引用(*),指针需要解引用;
引用只能在定义时被初始化一次,之后不可变;指针可变;
引用没有const,指针有const;
引用不能为空,指针可以为空;
"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身(所指向的变量或对象的地址)的大小;
和引用的自增(++)运算意义不一样;
在内存分配上,程序为指针变量分配内存区域,而引用不需要分配内存区域。
感谢:http://blog.csdn.net/pkueecser/article/details/6333179
相关文章推荐
- 理解C++ dynamic_cast
- C++静态库与动态库(转载)
- 乘法口诀表的输出(改)
- VS使用c++的动态链接库
- c语言的文件操作
- C++中4中类型转换的区别
- 1004. 成绩排名 (20)
- C++空类占用内存的问题
- c++ map 根据值的顺序返回排好的键值数组
- C static 函数与变量
- C++ time_t与string之间转换的工具类
- C语言学习笔记
- Leetcode Subsets II
- C++知识点整理——持续更新
- Effective modern C++ 条款 40:注意不同线程句柄的析构函数的行为
- 一个C++ 发送邮件的类
- Effective modern C++ 条款 39:让std::thread在所有路径上不可join(Make std::threads unjoinable on all paths)
- typedef struct 小结
- C++使用localtime函数需要注意的地方
- Beautiful Array