Impossible is nothing
爱过知情重醉过知酒浓 花开花谢终是空 缘份不停留像春风来又走 女人如花花似梦
公告
日历
<
2024年11月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
统计
随笔 - 8
文章 - 91
评论 - 16
引用 - 0
导航
C++博客
首页
发新随笔
发新文章
联系
聚合
管理
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
(4)
STL/BOOST(4)
(rss)
随笔档案
(8)
2006年6月 (2)
2006年4月 (4)
2006年3月 (1)
2006年2月 (1)
文章分类
(77)
C++语言(57)
(rss)
GDI/GDI+(1)
(rss)
Windows/MFC(3)
(rss)
编译器(4)
(rss)
软件工程(11)
(rss)
图像处理(1)
(rss)
文章档案
(91)
2006年7月 (4)
2006年6月 (12)
2006年5月 (3)
2006年4月 (4)
2006年3月 (27)
2006年2月 (41)
相册
文章用图
搜索
最新评论
1. re: STL学习笔记[未登录]
很详细,赞
--bneliao
2. re: 深度探索c++的对象模型
笔记很详细,赞
--bneliao
3. re: 近日复习记录
不错嘛!
--秦歌
4. re: 区域填充算法
顶顶顶顶顶顶顶顶
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
顶顶顶顶
顶顶顶顶
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
顶顶顶顶
--lishali
5. re: Singleton模式的演化[未登录]
评论内容较长,点击标题查看
--galaxy
阅读排行榜
1. 从输入流中读入一行(2236)
2. sap的几道笔试题目(转)(1435)
3. 工作中发现的(1313)
4. 什么是调色板?(961)
5. Stay Hungry, Stay Foolish" (818)
6. 继续贴面试题目(708)
7. 近日复习记录(624)
8. 要读的书(516)
评论排行榜
1. 工作中发现的(3)
2. sap的几道笔试题目(转)(2)
3. 继续贴面试题目(1)
4. 从输入流中读入一行(1)
5. Stay Hungry, Stay Foolish" (1)
一个关于指针的问题
一个关于指针的问题
有些东西在你没有遇到之前还真是不知道自己没有弄清楚,也许是我平时细节的地方注意少了,看来以后要多加注意了。
char
*
pStr;
char
ch;
char
str[]
=
"
Hello
"
;
ch
=
str[
1
];
*
pStr
=
str[
1
];
printf(
"
ch = %c\n
"
, ch);
printf(
"
*pStr = %c
"
,
*
pStr);
此时打印ch值的时候能正确输出,但是打印pStr[0]的时候就出问题了,跟踪发现是pStr[0] = str[1];这句出现问题。
原 来,char *pStr; 只定义了一个4字节的指针变量,而这个变量里面的内容是将要指向一个char类型变量的,但是此时pStr只是个“野指针”,并没有指向一个char类型 的内存单元,所以,当用*pStr来访问这个元素时,系统根本不知道该访问何处的空间,因此,在使用pStr前,必须让它指向一个具体的空间。
由上面可以将相关语句改为
char
*
pStr;
char
ch;
char
str[]
=
"
Hello
"
;
pStr
=
&
ch;
//
pStr指向ch、获得初始化
pStr
=
&
str[
1
];
//
pStr指向str[1]地址、获得初始化
ch
=
str[
1
];
*
pStr
=
str[
1
];
printf(
"
ch = %c\n
"
, ch);
printf(
"
*pStr = %c
"
,
*
pStr);
也就是说,要先给指针一个地址值初始化它,然后才能用*访问它指向的内容。
◎另外,
在子函数中使用malloc()/new()分配的内存空间不会因子函数的返回而消失
,函数只会清理调子函数里定义的变量的空间,如:
char
*
func()
{
char
*
p;
p
=
(
char
*
)malloc(
sizeof
(
char
));
return
p;
}
//
返回后,p所在空间被释放,但是p所指空间还存在
所以,可以用p1=func();来获得在func()中分配的空间。
此中方法可以用来解决“指针的指针”使用不方便的问题。步骤分2步:1、把传入的指针的指针参数去掉;2、把函数的返回值赋给要改变的对象的指针:
void
GetMemory2(
char
**
p,
int
num)
{
*
p
=
(
char
*
)malloc(
sizeof
(
char
)
*
num);
}
void
Test2(
void
)
{
char
*
str
=
NULL;
GetMemory2(
&
str,
100
);
//
注意参数是 &str,而不是str
strcpy(str,
"
hello
"
);
cout
<<
str
<<
endl;
free(str);
}
/**/
//////
下面是用传递动态内存的方法实现
char
*
GetMemory3(
int
num)
{
char
*
p
=
(
char
*
)malloc(
sizeof
(
char
)
*
num);
return
p;
}
void
Test3(
void
)
{
char
*
str
=
NULL;
str
=
GetMemory3(
100
);
strcpy(str,
"
hello
"
);
cout
<<
str
<<
endl;
free(str);
}
因 为此时用malloc/new分配的内存空间是堆里面的,函数返回时不会回收;而如果在子函数中用char p[]="asdfgewq";则p是在栈中定义的(先分配p的空间,然后讲字符串拷贝进去,跟char *p="asdfasdf"分配在全局静态内存中不一样),所以会被系统收回。
posted on 2006-03-08 23:16
笑笑生
阅读(216)
评论(0)
编辑
收藏
引用
所属分类:
C++语言
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
Effective C++
Essential C++读书笔记
深度探索c++的对象模型
理解复杂声明
一个模板巧妙技术,语法技巧
一个复杂的boost.lambda表达式的例子
C++ 编程思想学习笔记-命名控制
2005年华为招聘--C语言笔试试题
dynamic_cast详解
vc++7.1转移到vc++2005 需要的一些变动
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
Copyright © 笑笑生
Powered by:
博客园
模板提供:
沪江博客