| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1874 人关注过本帖
标题:求教二级指针的问题
只看楼主 加入收藏
雷老八
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2018-8-4
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:6 
求教二级指针的问题
int main (void)
{
    char * a[5] ={"abc","efasg","asgfw"};
    printf("%s ",a[0]);
    printf("%s",**a);
}
a数组里是指向char的指针。那么a[0]的值不是字符串的地址吗?怎么能直接显示字符串。
a是二级指针,*a是指向指针的值,**a才是字符串的值吧?但第3行是错的..用一个*就能显示字符串。
始终不能理解觉得应该是 *a[0]..不过好像没这种操作吧
搜索更多相关主题的帖子: 二级 指针 char 字符串 显示 
2018-08-16 10:34
雷老八
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2018-8-4
收藏
得分:0 
我版内搜索了下,发现有个朋友遇到和我一样的问题。不过看了还是没能理解..
https://bbs.bccn.net/viewthread.php?tid=466662&highlight=%B6%FE%BC%B6%D7%D6%B7%FB%D6%B8%D5%EB
2018-08-16 11:04
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:5 
char * a[5] ={"abc","efasg","asgfw"};
------ 应该是 const char* a[5] = { "abc", "efasg", "asgfw" };
因为 a[0] 的类型是 const char[4],a[1]、a[2] 的类型是 const char[6],它们俱可降阶为 const char*。
不加const时部分编译器不报错,只是为了照顾历史上遗留的旧代码,不是让你现在仍然这样用的。

a[0]的值不是字符串的地址吗?
------ 是
怎么能直接显示字符串
------ printf函数就是这么实现的,%s后面对应一个字符串地址,它输出这个地址处的字符串。
知道了地址,就可以取地址处的值,不知道你的疑惑从何而来?

a是二级指针
------ 不,a不是指针,当然也不是什么二级指针(C/C++标准中根本就没这说法)。
a是数组,a是一个元素类型为const char*,容量为5的数组。

*a是指向指针的值
------ 数组可隐式降阶为指针,故 *a 就是 *(&a[0]),即 a[0]
**a才是字符串的值吧?
------ 上面讲过 *a 等同于 a[0],因此 **a 等同于 *a[0]。同理,它也就是 a[0][0],即 'a'。
但第3行是错的..用一个*就能显示字符串
------ 由上可知,printf("%s",**a)等效于printf("%s",'a'),当然是错误的;
printf("%s",*a)等效于printf("%s","abc"),当然是正确的。
2018-08-16 12:19
雷老八
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2018-8-4
收藏
得分:0 
回复 3楼 rjsp
------ printf函数就是这么实现的,%s后面对应一个字符串地址,它输出这个地址处的字符串。
  
查了下 printf参数为%s时的输出过程确实是这样..
我以为会把地址以字符串的形式输出,想想我显示字符串时也是把字符串放进数组然后printf("%s",数组名);
应该是%c时才需要地址上的值,%s地址就够了。
谢谢大佬解答的这么详细了

2018-08-16 16:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
我以为会把地址以字符串的形式输出
------ 你描述的是 printf( "%p"

程序代码:
#include <stdio.h>

int main (void)
{
    const char* s = "abc";

    printf( "%s\n", s );
    printf( "%p\n", s );
}

假如 s 指向 0x01234567( 即假如 "abc"在内存 0x01234567 处 ),那么将输出
abc
01234567
也就是说 %s 输出字符串,%p 输出指针值
2018-08-16 16:22
雷老八
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2018-8-4
收藏
得分:0 
回复 5楼 rjsp
假如 s 指向 0x01234567( 即假如 "abc"在内存 0x01234567 处 )
话说"abc"不用加&吗?我加上也没变化..用const int * a[]就要加上&。
2018-08-16 20:13
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
回复 楼主 雷老八
不要太过关注数组的名字a,重点理解数组a的元素。
这个数组a每个元素a[i]存放的是各个字符串的地址。
对各字符串的寻址涉及到地址的地址,用个名字来表达就是通常说的“指针”的“指针”,可能就是你所说的“二级指针”。
这样看看:
    char * a[5] ={"abc","efasg","asgfw"};
    printf("%s\n", a[0]);
    printf("%s\n", a[1]);
    printf("%s\n", a[2]);
    char **p = &a[1];
    printf("%s\n", *(p-1));
    printf("%s\n", *p);
    printf("%s\n", *(p+1));

2018-08-17 05:17
快速回复:求教二级指针的问题
数据加载中...
 
   



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

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