cczzz 发表于 2017-10-18 20:54:47

为什么 char *(*pp)[4] =& p;可以找对地址,char (*cc)[4] = p;不行?

#include<stdio.h>
int main()
{ char *p={"hello","asdasd","howare","cjc"

            };
    char *(*pp) =& p;
   char (*cc) = p;
   
    printf("%s\t,%s\n",(*pp),p);
   
   printf("%p\t,%p\n",(*pp)+1,p+1);
      printf("%p\t,%p\n",cc+1,p+1);
   printf("%p\t,%p\n",cc,*pp);

}
为什么 char *(*pp) =& p;可以找对地址,char (*cc) = p;不行?

cczzz 发表于 2017-10-18 20:56:28

char (*cc) = p;不行我知道为什么, char *(*pp) =& p;为什么给了&P后 ,每次都能找对地址啊?

BngThea 发表于 2017-10-18 21:35:03

指向指针数组的指针的指针数组,解指针后应该和原来的一模一样吧

丶忘却的年少o 发表于 2017-10-18 21:40:51

因为pp指向的是有4个元素的数组的指针,那么指针必定会和数组的每一个元素对应起来。看代码来讲就是pp得到的是&p,是整个指针数组的范围,而cc只是得到了数组的第一元素地址。
#include<stdio.h>
int main()
{
        char *p={"hello","asdasd","howare","cjc"};
        char *(*pp) =&p;
        char (*cc) = p;
       
        printf("%s\t,%s\n",(*pp),cc);

        printf("%p\t%p\t%p\n", p, cc+0, (*pp));
}
p是指针数组也是数组名,查看某一字符串地址就要先得到指针;pp是指向指针数组的数组指针查看地址就要先解引用得到数组地址,再找到对应的下标的数组指针;而cc就是指针,直接打印地址

丶忘却的年少o 发表于 2017-10-18 21:42:11

思考了半天怎么说,居然被抢先了{:10_250:}

cczzz 发表于 2017-10-18 21:59:05

丶忘却的年少o 发表于 2017-10-18 21:42
思考了半天怎么说,居然被抢先了

{:10_287:}

丶忘却的年少o 发表于 2017-10-18 22:00:35

cczzz 发表于 2017-10-18 21:59


要是觉得看得懂并且懂了,麻烦点下“最佳答案”{:10_338:}

lh625243422 发表于 2017-10-18 22:01:24

本帖最后由 lh625243422 于 2017-10-18 22:06 编辑

cannot convert 'char* (*)' to 'char (*)' in initialization
意思是2种指针类型不同不能赋值,注意给指针赋值并不等于把首地址给他就行,
而是数据类型和数据首地址。
char *(*pp) =&p;这是个指向指针数组,(*p[],所以必须是&加数组名,具体查看小甲鱼带《你学习带你飞》23课 )的指针的指针
指向指针数组指针的指针就是指向数组p,然后p是指向字符串(字符串常量可看做指针)指针的数组,所以再次指向字符串指针。

lh625243422 发表于 2017-10-18 22:09:26

丶忘却的年少o 发表于 2017-10-18 21:40
因为pp指向的是有4个元素的数组的指针,那么指针必定会和数组的每一个元素对应起来。看代码来讲就是pp得到 ...

我的会报错你的不会? cannot convert 'char**' to 'char (*)' in initialization

丶忘却的年少o 发表于 2017-10-18 22:14:04

lh625243422 发表于 2017-10-18 22:09
我的会报错你的不会? cannot convert 'char**' to 'char (*)' in initialization

你说我的改的程序还他自己写的?
我这里都不会报错,都是可以运行的。我用的是VC++6.0

lh625243422 发表于 2017-10-18 22:16:09

丶忘却的年少o 发表于 2017-10-18 22:14
你说我的改的程序还他自己写的?
我这里都不会报错,都是可以运行的。我用的是VC++6.0

我的是dev c++

cczzz 发表于 2017-10-18 23:13:28

丶忘却的年少o 发表于 2017-10-18 22:00
要是觉得看得懂并且懂了,麻烦点下“最佳答案”

指针数组不是储存的是地址吗?地址的长度应该都一样吗?为什么储存地址的地址长度都不一样啊?

丶忘却的年少o 发表于 2017-10-18 23:22:22

cczzz 发表于 2017-10-18 23:13
指针数组不是储存的是地址吗?地址的长度应该都一样吗?为什么储存地址的地址长度都不一样啊?

是的,是地址。 长度都是一样的八位,只是地址不一样。就要,就是因为存储的地址(就是指针指向的地址)不一样,才会使得打印出来的东西不一样。

cczzz 发表于 2017-10-18 23:32:03

丶忘却的年少o 发表于 2017-10-18 23:22
是的,是地址。 长度都是一样的八位,只是地址不一样。就要,就是因为存储的地址(就是指针指向的地址) ...

#include<stdio.h>
int main()
{
      char *p={"hello","asdasd","howare","cjc"};
      
      
      
      printf("%s\t",p);
      printf("p的地址是%p\t",p);
      
      printf("p的地址是%p\t",p+1);
      printf("\np的地址是%p\t",p+2);
} 你跑下这个程序,打出来的是储存地址的地址,他们的字节不一样

丶忘却的年少o 发表于 2017-10-18 23:34:52

cczzz 发表于 2017-10-18 23:32
你跑下这个程序,打出来的是储存地址的地址,他们的字节不一样

我刚要和你说,等会,我在你的另一个帖子写,等会就发出来,稍等
页: [1]
查看完整版本: 为什么 char *(*pp)[4] =& p;可以找对地址,char (*cc)[4] = p;不行?