| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3006 人关注过本帖
标题:求助:p为指向一个指向字符数组的指针变量的指针。
只看楼主 加入收藏
peter张
Rank: 2
等 级:论坛游民
威 望:1
帖 子:56
专家分:98
注 册:2017-3-7
结帖率:100%
收藏
 问题点数:0 回复次数:12 
求助:p为指向一个指向字符数组的指针变量的指针。
不定义行指针,能不能像如下代码中定义一个指向指针的指针,然后打印字符串“c program”。


#include <stdio.h>

int main()
{
    char str[][9]={"hello ","c program"};
    char **p;
    p =str;
    printf("%s",**p);

    return 0;
}

代码能够编译通过,不能执行。
搜索更多相关主题的帖子: include return 字符串 hello 
2017-03-25 22:11
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
把**p。换成p+1试试

DO IT YOURSELF !
2017-03-25 22:17
peter张
Rank: 2
等 级:论坛游民
威 望:1
帖 子:56
专家分:98
注 册:2017-3-7
收藏
得分:0 
回复 2楼 wp231957
迷到这了。不理解。
图片附件: 游客没有浏览图片的权限,请 登录注册
2017-03-25 22:23
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1697
专家分:4305
注 册:2007-12-27
收藏
得分:0 
首先,char [9]是放不下"c program"的。
其次,兼容str的指针是char (*p)[9],当然,具体的9还是要改的。
最后,输出字符串的时候需要的是一个char*类型的东东,既不能是**p,也不能是p或p+1,只能是*p或者*(p+1)这种级别的指针。(针对楼主定义的char **p来说的)

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2017-03-25 23:10
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1697
专家分:4305
注 册:2007-12-27
收藏
得分:0 
#include <stdio.h>

 int main()
 {
     char str[][10]={"hello ","c program"};
     char (*p)[10];
     p =str;
     printf("%s",*(p+1));

     return 0;
 }

[此贴子已经被作者于2017-3-25 23:17编辑过]


对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2017-03-25 23:14
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
收藏
得分:0 
看来你对指针还是一知半解搞清楚这几个
str[0] + 1;
&str + 1;
str + 1;
2017-03-26 00:50
captain2050
Rank: 2
等 级:论坛游民
帖 子:57
专家分:43
注 册:2016-7-15
收藏
得分:0 
每个指向字符串的指针指向一维数组,别指向二维的,我觉得是这个问题
2017-03-26 07:55
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
不能执行是因为,第二字符串太大,你把数组第二维改成10就解决了。
当然,对于需要初始化的字符串,为什么要用数组?多余,直接用指针就好了。
创建在程序运行时需要修改的字符串,才需要用数组,但是对于这样的数组,又何必初始化?

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-03-26 08:09
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 3楼 peter张
先要理解指针的两个重要特性:地址和大小。
地址...是指针表达的存储数据的地方。
大小...是指针表达的存储数据地方大小。

就此话题来说:

先看看 char **p;
p指针的地址属性是一个存放地址值的地方;p指针的大小属性是这个地方的大小,大小要看编译器环境:
    设p的地址 0x100000。
    16位编译为2Byte,p+1的地址 0x100002。
    32位编译为4Byte,p+1的地址 0x100004。
    64位编译为8Byte,p+1的地址 0x100008。

再看看 char str[][10]={"hello ","c program"};
str是数组名,表达的是数组的首址,具有指针的性质。
str的地址属性是一个存放一组数据的地方;str的大小属性是这个地方的大小,大小是10Byte。
    设str的地址 0x100000。
    str+1的地址 0x10000A。
    str+2的地址 0x100014。

可见,用char **p通过p+1来表达str+1不切实际,除非是很确定p+i==str+i(硬来的)。
2017-03-26 08:48
peter张
Rank: 2
等 级:论坛游民
威 望:1
帖 子:56
专家分:98
注 册:2017-3-7
收藏
得分:0 
回复 4楼 forever74
谢谢,学习到了。
2017-03-26 09:35
快速回复:求助:p为指向一个指向字符数组的指针变量的指针。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045782 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved