标题:关于指针的困惑
只看楼主
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
结帖率:85.71%
已结贴  问题点数:20 回复次数:7 
关于指针的困惑
有一段代码是这样:
#include <stdio.h>
int main()
{
    char *name[]={"Follow me","Basic","Great Wall","FORTRAN","computer design"};
    char *p;
   p=*(name+1);
   printf("%s\n",p);
   return 0;  
}
运行正确,但按我的看法,name是指name指定数组首元素的地址,应该是行指针,既然如此,我把其中一句改为
p=name+1为什么不行,等式两边都是地址,应该没问题,但我试着运行,系统出现了警告,[Warning] assignment from incompatible pointer type,运行错误,为什么??我反而觉得源代码的*()是多余的,因为一旦加上*只是把行地址name+1转换为列地址,的确可以,但我的又错在哪?求教该怎么理解
搜索更多相关主题的帖子: computer include 源代码 design return 
2017-02-09 19:07
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
得分:7 
name是char**型了,当然不能对char*赋值了
2017-02-09 19:29
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:5 
name是指针数组,这样看看就清楚:
#include <stdio.h>
int main()
{
    char *name[]={"Follow me","Basic","Great Wall","FORTRAN","computer design"};
    printf("%s\n",name[0]);
    printf("%s\n",name[1]);
    printf("%s\n",name[2]);
    printf("%s\n",name[3]);
    printf("%s\n",name[4]);
    return 0;  
}
2017-02-09 20:03
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:8 
name是指name指定数组首元素的地址
------ 数组不是地址,数组只是可以隐式转化为指针而已

name的类型是 char* [5]
name+1 时 char* name[5] 转化为 char**
name+1 相当于 &name[0] + 1,亦即 &name[1]
2017-02-10 08:35
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
char *name[]={"Follow me","Basic","Great Wall","FORTRAN","computer design"};
这句是分配存储5个字符串(用'\0'结束)的连续空间和分配5个存储这5个字符串地址的连续空间。
明白存储空间分配情况就好处理,变换对比一下看看是不是好理解点。
#include <stdio.h>

main()
{
    //char *name[]={"Follow me","Basic","Great Wall","FORTRAN","computer design"};
    //相当于:
    char s[]="Follow me\0Basic\0Great Wall\0FORTRAN\0computer design";
    char *name[]={s, s+10, s+16, s+27, s+35};
    int i;
    for (i=0; i<5; i++)
        printf("%s\n", name[i]);
    printf("\n");
    //或者:
    unsigned long name2[]={(unsigned long)s, (unsigned long)(s+10), (unsigned long)(s+16), (unsigned long)(s+27), (unsigned long)(s+35)};
    for (i=0; i<5; i++)
        printf("%s\n", (char *)name2[i]);
}
2017-02-10 11:54
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
得分:0 
回复 2楼 yangfrancis
name本身就是地址啊,为什么会是指向指针的指针???难道这里的name不应该和普通一维数组name[]的name一样吗??都是代笔首元素的地址啊

............
2017-02-10 15:22
邹特强
Rank: 2
等 级:论坛游民
帖 子:123
专家分:85
注 册:2016-9-21
得分:0 
回复 2楼 yangfrancis
懂了,你是对的,指针数组每个元素就是一个地址,而name是指向首元素,当然是char**型

............
2017-02-10 15:33
藤田惠美
Rank: 1
等 级:新手上路
帖 子:6
专家分:2
注 册:2016-10-3
得分:0 
回复 楼主 邹特强
char *p,p是指向char的指针变量;name+1,name是指针数组,指向的是指针变量,当然name+1也是指向指针变量了。所以p=name+1是有语法错误的。
2017-02-14 15:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-474107-1-1.html




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

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