为生存而奔跑
::
首页
::
联系
::
聚合
::
管理
271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks
留言簿
(5)
给我留言
查看公开留言
查看私人留言
我参与的团队
随笔分类
Algorithm(73)
C#(19)
Design Pattern(16)
Effective STL / C++ (12)
Information Retrival / Data Mining(13)
Java(25)
Linux kernel(2)
MFC(16)
Python(5)
TopCoder(1)
Ubuntu&Linux(56)
技术(12)
无聊(2)
杂(22)
随笔档案
2011年5月 (1)
2011年4月 (6)
2011年3月 (21)
2011年2月 (9)
2011年1月 (12)
2010年12月 (2)
2010年11月 (3)
2010年10月 (6)
2010年8月 (13)
2010年7月 (11)
2010年6月 (7)
2010年5月 (21)
2010年4月 (15)
2010年3月 (16)
2010年1月 (5)
2009年12月 (18)
2009年11月 (18)
2009年10月 (19)
2009年9月 (8)
2009年8月 (42)
2009年7月 (15)
2009年4月 (3)
相册
Girl
搜索
积分与排名
积分 - 323612
排名 - 74
最新评论
1. re: Invoke与BeginInvoke
讲得很好,清晰明了
--YJJ
2. re: Invoke与BeginInvoke
讲的这么好, 为啥没有人顶呢
--zhouandke
3. re: 数组分割问题
转载请注明
--呵呵
4. re: HDU 3415 单调队列
话说,sum数组为什么只开10W就能过,如果n=100000,k=100000,明显要开20W啊
--KissLL
5. re: GDB 单步调试
文章太强大了。
--kangear
阅读排行榜
1. GDB 单步调试(33283)
2. Emacs教程(20784)
3. 解决“windows无法连接到选定网络 网络可能不在区域中”(11445)
4. Invoke与BeginInvoke(9559)
5. Eclipse下搭建SWT开发环境(7944)
评论排行榜
1. C/C++没有数组(12)
2. HDU 3415 单调队列(8)
3. Ubuntu Linux常见中文输入法汇总(7)
4. word画图里自选图形里面的连接符不能用(5)
5. VMware Tools installation cannot be started manually while Easy Install is in progress.(3)
指针做参数
百度一个笔试题
#include
<
iostream
>
using
namespace
std;
struct
complex_t
{
int
real;
int
imag;
}
;
int
create(complex_t
*
p, unsigned
int
n)
{
p
=
new
complex_t[n];
if
(p
==
NULL)
return
-
1
;
else
return
0
;
}
int
main()
{
complex_t
*
comps
=
NULL;
unsigned
int
num
=
0
;
cin
>>
num;
if
(create(comps,num)
<
0
)
{
printf(
"
create failed\n
"
);
return
-
1
;
}
/**/
/*
if(comps == NULL)
{
cout<<"comps is NULL\n";
return -1;
}
*/
//
comps = new complex_t[num];
long
long
int
sum
=
0
;
unsigned
int
pos
=
0
;
cin
>>
pos;
while
(pos
<
num)
{
cin
>>
comps[pos].real
>>
comps[pos].imag;
cin
>>
comps[pos
+
1
].real
>>
comps[pos
+
1
].imag;
sum
+=
comps[pos].real
*
comps[pos
+
1
].real
+
comps[pos].imag
*
comps[pos
+
1
].imag;
pos
+=
2
;
}
cout
<<
"
sum is
"
<<
sum
<<
endl;
return
0
;
}
很容易被忽悠的一个地方是,create函数的第一个参数,类型时complex_t * p。 然后,在create里面给p分配了一块存储空间。 乍一看,因为是指针做参数,所以会传递回去。其实不然。在这里,相当于,首先,main函数中调用create函数时,把comps赋值给p。即指针p指向与comps相同的一段存储空间。 但是,在create里面,p=new complex_t[n],使得p又指向了一块新的存储空间。而此时,comps还是指向原来的存储空间。所以,在create里面对p做的更改对comps并没有影响。
一个解决方法是使用指向指针的指针。如下
#include
<
iostream
>
using
namespace
std;
struct
complex_t
{
int
real;
int
imag;
}
;
int
create(complex_t
**
p, unsigned
int
n)
{
*
p
=
new
complex_t[n];
if
(p
==
NULL)
return
-
1
;
else
return
0
;
}
int
main()
{
complex_t
*
comps
=
NULL;
unsigned
int
num
=
0
;
cin
>>
num;
if
(create(
&
comps,num)
<
0
)
{
printf(
"
create failed\n
"
);
return
-
1
;
}
/**/
/*
if(comps == NULL)
{
cout<<"comps is NULL\n";
return -1;
}
*/
//
comps = new complex_t[num];
long
long
int
sum
=
0
;
unsigned
int
pos
=
0
;
cin
>>
pos;
while
(pos
<
num)
{
cin
>>
comps[pos].real
>>
comps[pos].imag;
cin
>>
comps[pos
+
1
].real
>>
comps[pos
+
1
].imag;
sum
+=
comps[pos].real
*
comps[pos
+
1
].real
+
comps[pos].imag
*
comps[pos
+
1
].imag;
pos
+=
2
;
}
cout
<<
"
sum is
"
<<
sum
<<
endl;
return
0
;
}
另外一种方法是,在main函数中申请空间,而不是在create函数中。
看下面的例子
bool
isDigit(
char
ch)
{
return
ch
>=
'
0
'
&&
ch
<=
'
9
'
;
}
int
maxContinueNum(
const
char
*
inputstr,
char
*
outputstr)
{
int
i,j;
int
maxlen
=
0
;
int
start;
i
=
0
;
while
(inputstr[i]
!=
'
\0
'
)
{
if
(isDigit(inputstr[i]))
{
j
=
i
+
1
;
while
(inputstr[j]
!=
'
\0
'
&&
isDigit(inputstr[j]))
j
++
;
if
(j
-
i
>
maxlen)
{
maxlen
=
j
-
i;
start
=
i;
}
i
=
j;
}
else
i
++
;
}
for
(i
=
0
;i
<
maxlen;i
++
)
outputstr[i]
=
inputstr[i
+
start];
outputstr[i]
=
'
\0
'
;
return
maxlen;
}
int
main()
{
char
input[]
=
{
"
abcd12345ed125ss123456789
"
}
;
char
*
output
=
new
char
[
100
];
cout
<<
maxContinueNum(input, output)
<<
endl;
cout
<<
output
<<
endl;
}
outputstr在main函数中申请内存,在maxContinueNum函数中更改其中的值。
posted on 2011-05-04 23:43
baby-fly
阅读(629)
评论(0)
编辑
收藏
引用
所属分类:
Effective STL / C++
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
指针做参数
C++虚函数表解析(转)
More Effective C++ 不要对数组使用多态
Clause 19:相等equality 和等价 equivalence
Clause 21:总是让比较函数在等值情况下返回false
STL中仿函数(functors)、类成员和mem_fun的使用
STL之仿函数,适配器简介
STL lower_bound upper_bound equal_range
Clause 22 不要直接修改set或multiset中的键值
Clause 19 删除元素的方法
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Copyright @ baby-fly
Powered by:
.Text
and
ASP.NET
Theme by:
.NET Monster