| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1549 人关注过本帖
标题:关于array of pointer to char的疑问
只看楼主 加入收藏
BULLZHAO
Rank: 2
等 级:论坛游民
帖 子:16
专家分:26
注 册:2017-10-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
关于array of pointer to char的疑问
K&R的书里第94页写了
char * lineptr[MAXLINES];
void writelines(char * lineptr[],int nlines)
{
    while (nlines-->0)
        printf("%s\n",*lineptr++);
}
直接用数组名可以输出,可是我下面的语句为什么总是报错?
#define NL printf("\n")
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;

int main()
{
char s1[]="gswa";
char s2[]="wym";
char s3[]="zyx";
char s4[]="kwl";
char * pp[4];
pp[0]=s1;
pp[1]=s2;
pp[2]=s3;
pp[3]=s4;
int i001;
for (i001=0;i001<4;i001++) cout<<pp[i001]<<'\t';
NL;
for (i001=0;i001<4;i001++) printf("%s\t",*pp++);//报错
NL;
return 0;
}
错误信息是iso c++ forbid cast to non-reference type used as lvalue.是编译器标准更严格了吗?
搜索更多相关主题的帖子: array char int printf include 
2017-10-13 17:42
BULLZHAO
Rank: 2
等 级:论坛游民
帖 子:16
专家分:26
注 册:2017-10-7
收藏
得分:0 
char **ptrptr;
ptrptr=pp;
for (i001=0;i001<4;i001++) cout<<(*ptrptr)++<<'\t';NL;
*ptrptr-=4;
for (i001=0;i001<4;i001++) cout<<*(ptrptr++)<<'\t';NL;//现在不报错了

又研究了下,最后加上这几行就可以了.说明数组名不能用++? K&R写C程序设计语言时可以?
2017-10-13 19:02
BULLZHAO
Rank: 2
等 级:论坛游民
帖 子:16
专家分:26
注 册:2017-10-7
收藏
得分:0 
for (i001=0;i001<4;i001++) cout<<*(ptrptr++)<<'\t';NL;//现在不报错了
void writelines(char *p[],int nlines);
writelines(pp,4);
return 0;
}

void writelines(char *p[],int nlines)
{
    while (nlines-->0)
        printf("%s\n",*p++);
}

晕了,最后一段改为上面这样,也能运行.K&R书上没错,那么是怎么回事呢?
2017-10-13 19:25
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:20 
回复 楼主 BULLZHAO
char * pp[4];
pp是数组,表达的是一组数,pp++意味着什么?pp不能作左值。
2017-10-13 20:10
BULLZHAO
Rank: 2
等 级:论坛游民
帖 子:16
专家分:26
注 册:2017-10-7
收藏
得分:0 
以下是引用吹水佬在2017-10-13 20:10:03的发言:

char * pp[4];
pp是数组,表达的是一组数,pp++意味着什么?pp不能作左值。


pp是数组,网上查了一下,说不能作左值自加,可是把pp作为参数传递到writelines(char *lineptr[],int nlines)函数里,为什么函数里 *lineptr++编译可以通过,结果也对? 而且writelines()这个函数我是全抄K&R书上第94页的啊.
2017-10-13 20:15
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
    char **p = pp;
    for (i001=0;i001<4;i001++) printf("%s\t",*p++);
2017-10-13 20:15
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用BULLZHAO在2017-10-13 20:15:02的发言:



pp是数组,网上查了一下,说不能作左值自加,可是把pp作为参数传递到writelines(char *lineptr[],int nlines)函数里,为什么函数里 *lineptr++编译可以通过,结果也对? 而且writelines()这个函数我是全抄K&R书上第94页的啊.

writelines(char *lineptr[],int nlines)
相当于:
writelines(char **lineptr,int nlines)
2017-10-13 20:21
BULLZHAO
Rank: 2
等 级:论坛游民
帖 子:16
专家分:26
注 册:2017-10-7
收藏
得分:0 
以下是引用吹水佬在2017-10-13 20:15:06的发言:

    char **p = pp;
    for (i001=0;i001<4;i001++) printf("%s\t",*p++);


我知道这样是对的,我在二楼里用的ptrptr和你的p是一样的. 我就是不能理解下面的函数:
void writelines(char *lineptr[],int nlines)
{
    while (nlines-->0)
        printf("%s\n",*lineptr++);
}//完全抄自C程序设计语言 第94页
中的lineptr这个数组名在函数中可以自加,但是不在函数中就报错.
2017-10-13 20:21
BULLZHAO
Rank: 2
等 级:论坛游民
帖 子:16
专家分:26
注 册:2017-10-7
收藏
得分:0 
以下是引用吹水佬在2017-10-13 20:21:30的发言:


writelines(char *lineptr[],int nlines)
相当于:
writelines(char **lineptr,int nlines)


学习下,背后是什么道理呢?
2017-10-13 20:24
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用BULLZHAO在2017-10-13 20:24:15的发言:



学习下,背后是什么道理呢?

lineptr是指向pp的指针变量,不是pp。
2017-10-13 20:25
快速回复:关于array of pointer to char的疑问
数据加载中...
 
   



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

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