幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4102|回复: 14

[通用编程] [求助]问个指针的问题。

[复制链接]

50

主题

1235

帖子

1万

积分

⑧专业

C语言最高

积分
12447
发表于 2007-8-1 18:33:47 | 显示全部楼层 |阅读模式
Essential C++中说,指针可以带来程序的弹性,不过貌似没有说清楚。

到底直接对对象操作和使用指针操作有些什么不同之处?

if (*pi !=1024)
*pi=1024

书中的有个例子是这样的,若指针pi不等于1024,则将1024代入*pi,这有点令人费解。
这样做在哪方面提高了弹性??万望赐教。
我的blog~:http://hi.baidu.com/soaryou/blog
回复

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2007-8-1 21:25:14 | 显示全部楼层
这个例子没有上下文了么。就这么两行,看着实在是费解。
え~え~お!!!
回复 支持 反对

使用道具 举报

313

主题

1574

帖子

1万

积分

⑧专业

*永恒国度*

积分
14145
QQ
发表于 2007-8-2 07:38:02 | 显示全部楼层
Essential C++ 昨天看了下两百七十多页, C++primer 1237页, [s:5] 真是太大的差别了,
[s:6] 我看我还是先把C学好再去学C++了.................
[img][/img] http://shop33698673.taobao.com被别人嫉妒,证明你优秀,嫉妒别人说明你无能
回复 支持 反对

使用道具 举报

136

主题

1751

帖子

548

积分

版主

Rank: 7Rank: 7Rank: 7

积分
548
发表于 2007-8-2 11:10:08 | 显示全部楼层
下了本Essential C++看了下。
  1. int ival = 1024;
  2. int *pi = &ival;
  3. if (*pi !=1024)
  4.     *pi=1024
复制代码
这是要说明指针的双重性。用*pi可以操作ival的值。而pi指的是ival的地址值。
え~え~お!!!
回复 支持 反对

使用道具 举报

19

主题

842

帖子

1万

积分

⑧专业

絕望青年,一起增高吧

积分
13676
发表于 2007-8-2 11:35:39 | 显示全部楼层
指針的彈性主要在動態記憶體配置上顯現
某吃過東西後再來說吧...

為著彼岸,便要與之妥協 但為著彼岸,更不能與之妥協

回复 支持 反对

使用道具 举报

19

主题

842

帖子

1万

积分

⑧专业

絕望青年,一起增高吧

积分
13676
发表于 2007-8-2 11:58:24 | 显示全部楼层
在一個一般的靜態陣列中,通常大小也是故定的
int array[10];
這樣的,其實,這下面兩組指令是一樣的
array[5] = 2;

int* arrayhead = array;
*(attayhead+sizeof(int))=2;
很易明白的,但這個代表著啥嘛?
比如說我在一個二位元檔案讀入兩個short int,很不幸地,用iostream讀入的二位元資料一定是以char陣列存起來
那如何是好呢?
char input[4]; ....

留意short int 是2 Byte大小的
那這是我們便可利用指標轉換的功能
short int result1, result2;
short int* ptr;
ptr = (short int*)(input);
result1 = *ptr;
ptr = (short int*)(input + sizeof(short int));
result2 = *ptr;

直接的轉換便方便得多了

為著彼岸,便要與之妥協 但為著彼岸,更不能與之妥協

回复 支持 反对

使用道具 举报

19

主题

842

帖子

1万

积分

⑧专业

絕望青年,一起增高吧

积分
13676
发表于 2007-8-2 12:17:51 | 显示全部楼层
上邊說有靜態陣列,那當然有動態陣列
也就是傳說中的new 和 delete
int *array = new int[40];
這樣便可以建立一個動態陣列
或者說,[填一個40進去大小還不是固定嗎。。]
那樣又如何呢?
int somevar = 155;
int *array = new int[somevar];
這個不錯吧。陣列的大小真的可以在程式中改變
不過記住,不再使用的動態陣列要把它們delete
delete array;
存取這些array最白木的方法當然是計算啦
cout << *(array + sizeof(int) *5);
不過世界上有更簡單的方法
cout << array[5];
兩句基本上是等價的

有人會問,二維陣列/多維陣列該如何?
一般情況下,靜態的二維陣列是一個四方形
int array[5][7];
//  01234567
//0XXXXXXXX
//1XXXXXXXX
//..XXXXXXXX
//4XXXXXXXX
但如使用動態的話,每一個細項的大小是可以不同的
//0XXXX
//1XXXXXXX
//2XX
//...
如何做到呢?
int **2darray;
一個二級指標,宣告一陣列的指標,再宣告一堆陣列
int element_I_need;
...
2darray = new int* [4];
2darray[0] = new int[10];
2darray[1] = new int[2];
2darray[2] = new int[888];
2darray[3] = new int[element_I_need];
用法也是一般的 2darray[2][53] = XXX;一般,但注意不要overflow
如2darray[1][222] = XXX; 基本上這指令是可以執行的,但後果自負
delete的時候由最深的開始delete

delete 2darray[0];delete 2darray[1];delete 2darray[2];delete 2darray[3];
delete 2darray;

當然指標還有很多用法,例如Link List和直接輸入地扯(異常危險,自重):
long address;
int *ptr;
cin >> address
ptr = (int*)address;
cout << *ptr;
因為所有指標也是long來的

那LZ便自己再找找指標的其他用法啦

為著彼岸,便要與之妥協 但為著彼岸,更不能與之妥協

回复 支持 反对

使用道具 举报

50

主题

1235

帖子

1万

积分

⑧专业

C语言最高

积分
12447
 楼主| 发表于 2007-8-2 18:17:17 | 显示全部楼层
[s:5] 好详细。。消化ing~~谢谢某C和shawind。
我的blog~:http://hi.baidu.com/soaryou/blog
回复 支持 反对

使用道具 举报

50

主题

994

帖子

6699

积分

管理员

爱干啥干啥!

Rank: 9Rank: 9Rank: 9

积分
6699
发表于 2007-8-2 20:23:21 | 显示全部楼层
譬如,当你需要用到多态的时候,指针是你唯一的出路-v-
当你需要传递一个对象作为参数的时候,指针也是很好的选择(引用亦可)。

顶帖里面提到的那个例子很不说明问题,指针显然不是用来干那种无聊的事情的……

“放下屠刀,立地成佛” 故应先杀生,然后再成佛。

(\\_/) (-_-) ()+() this is bunny priest.
回复 支持 反对

使用道具 举报

23

主题

218

帖子

2470

积分

⑥精研

积分
2470
发表于 2007-8-2 21:15:07 | 显示全部楼层
指针在操作数组、传递参数和动态分配内存的时候很有用……
ONScripter for PSP/Windows中文版 http://blog.163.com/john_he_
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-4 02:27 , Processed in 0.019371 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表