作者mp8113f (丹枫)
看板C_and_CPP
标题[问题] 双重 指标存取字串
时间Mon Apr 4 13:47:16 2016
http://ideone.com/UhNQlR 先附上原始程式码
这是某本书上的范例但是照打上去於DEv编译会出现错误
问题1 : 对於ptr = temp 的这行意义不是很了解
看字面上似乎想要让ptr指标指向temp指标存取的值(指向某字串的位址)
但temp并未初始,所以这个步骤对我来说有点诡异
问题2 : 我假设问题1的步骤可能是要这样写
ptr = &temp
那麽我想要让三个字串的起始位址连续存入三个记忆体位址中
於是我也写了跟范例一样的语法
*(ptr+0) = string1;
*(ptr+1) = string2;
*(ptr+2) = string3;
而我想要确认这三个位址是否真的连续接着
於是自行加上输出
for(n=0 ; n<3 ; n++)
printf("第%d个字串的位址为%p\n",n+1,*(ptr+n));
不过1跟2的位址是连续,但第三个位址直接跳去不知道哪个地方
很明显不连续
以至於我在加上输出列印时就产生错误
for(n=0 ; n<3 ; n++)
printf("第%d个字串的字串为%s\n",n+1,*(ptr+n));
想要知道问题的点在哪边 Orz ..毫无头绪
问题3 : 关於置底常见错误的12
别想对二维阵列使用pointer to pointer
想请问各位前辈时否有现成的案例可供小弟参考
最近也是有类似的想法正在练习不过好像没出现问题
怕我正在走上这条看似正确的误途上
初次在板上请教,烦请各位不吝指教
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.126.35.91
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1459748840.A.555.html
※ 编辑: mp8113f (59.126.35.91), 04/04/2016 13:49:44
※ 编辑: mp8113f (59.126.35.91), 04/04/2016 13:51:39
1F:推 stupid0319: 看到char **ptr,建议你还是换本书好了 04/04 13:55
2F:推 kai5566: 一楼?为什麽? 04/04 15:40
3F:→ stupid0319: 有两颗*就会有三颗,四颗,没完没了啊,无法理解的用法 04/04 16:03
4F:→ kai5566: .............这是什麽理由 04/04 16:04
5F:→ mp8113f: 我也想知道为甚麽,还是char** ptr比较简洁明了呢 04/04 16:04
6F:→ mp8113f: 另外问题二我想了想,是不是因为直接对*ptr做加减不保险 04/04 16:05
7F:→ mp8113f: 因为不一定会有stack区块让他存? 所以有些人可过有些不 04/04 16:06
8F:→ stupid0319: 我常看MSDN,可是机乎都不会出现两颗**的指标 04/04 16:15
9F:→ stupid0319: 大部分都typedef成一个类型,这样比较清楚 04/04 16:16
10F:→ mp8113f: 那如果该宣告pointer to pointer,该怎麽写比较专业 04/04 16:17
11F:→ mp8113f: 了解我再研究这个方式看看,感谢 ! 04/04 16:17
12F:→ mp8113f: 不过问题二还是不太清楚....囧 04/04 16:18
13F:→ stupid0319: 应该对pointer定义成看的懂,易理解明确的名称 04/04 16:19
14F:→ stupid0319: 指标是新手的罩门呀,其实不用想太多,把指标看成变数 04/04 16:20
15F:推 Bencrie: 最多就两颗吧 04/04 16:21
16F:推 ko27tye: 到底为什麽会到三颗四颗 最多就两颗阿 04/04 21:12
17F:推 ko27tye: 然後char**是强调型别为char**的ptr变数 04/04 21:18
18F:→ ko27tye: char **ptr是char型别的双重指标 两个都可以 看你想法 04/04 21:19
19F:推 ko27tye: 然後问题二 你这样是把三个string变数记忆体位置扔给 04/04 21:27
20F:→ ko27tye: ptr存,连续的是你的ptr 但那三个本来就不一定会连续 04/04 21:28
21F:→ mp8113f: 我大致上懂了,所以若我要连续存,最好方法是 04/04 21:30
22F:→ mp8113f: 我设定一个temp指标矩阵确保连续对吧? 04/04 21:31
23F:推 ko27tye: 不用阿...你&ptr &(ptr+1) &(ptr+2)出来会连续没错 04/04 21:33
24F:→ mp8113f: 没事,我弄反了,string本身不连续所以这样做不太保险 04/04 21:34
25F:→ mp8113f: 感谢你的解说 ! 04/04 21:35
26F:→ mp8113f: 若要确保三个字串连续那应该开个矩阵存这三串了 04/04 21:37
27F:→ mp8113f: 就不能用分开的方式存入指标 04/04 21:37
28F:推 ko27tye: yes 04/04 21:37
29F:→ mp8113f: 了解,不过这题我编译没问题,但执行会意外错误, 04/04 21:49
30F:→ mp8113f: 只能再找找是不是哪边写错了 04/04 21:50
31F:推 ko27tye: 指标可以存三种东西 0、某个物件的记忆体、另一个指标 04/04 22:02
32F:→ ko27tye: 你那个temp没指东西,然後ptr又指向它 很容易出错的 04/04 22:03
33F:→ mp8113f: 感谢k大指点,回去马上debug 04/04 22:04
34F:推 Caesar08: 如果你只学C,两个*有存在必要,你不能这样就把书丢掉 04/04 22:27
35F:→ Caesar08: 但如果你用的是C++,那你就不会看到两个*了 04/04 22:28
36F:→ Caesar08: 总而言之,建议你学C++而不是C 04/04 22:30
37F:→ mp8113f: 好的,下一个阶段即是要准备学c + 04/04 22:56