-1

我试图理解指向指针的指针,但我不明白为什么在第一种情况下我需要 (&) 和号(我收到一条消息 [Error] cannot convert 'char*' to 'char**' in assignment)和第二种情况情况下我不需要和号

第一种情况:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main ()
{
    
    char *p ={"jack is a good boy"};
    
    char**p1;
    
    p1=p; //why I need & in this case
    
    return0;
}

第二种情况:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


int main ()
{
    
    char *p[5] ={"jack","is", "a","good","boy"};
    
    int i=0;
    
    char**p1;
    
    p1=p;
    
    //p1=&p[0];
    
    for(p1=p; *p1; p1++)
    {
        
        
        printf("\n the words are %s",*p1);
    }
    
    return 0;
}
4

2 回答 2

0

p1=p; //为什么我需要 & 在这种情况下

变量p具有类型char *

char *p ={"jack is a good boy"};

虽然变量p1具有类型char **

char**p1;

所以你试图在赋值语句中使用不兼容的指针类型。

你需要写

p1 = &p;

在这种情况下,指针p1将指向p类型为 的对象char *。也就是说,指向对象的指针p将具有类型char **

在第二个程序中,您声明了一个元素类型为 的数组char *

char *p[5] ={"jack","is", "a","good","boy"};

表达式中使用的数组指示符(罕见异常)被隐式转换为指向其第一个元素的指针

所以在这个赋值语句中

p1=p;

相当于

p1 = &p[0];

p用作初始化程序的表达式被转换为 type char **。所以赋值的左右操作数具有相同的指针类型。

注意这个for循环

for(p1=p; *p1; p1++)
{
    
    
    printf("\n the words are %s",*p1);
}

调用未定义的行为,因为数组p 的元素之间没有空指针。*p1因此,与 相同的 for 循环条件*p1 != NULL将不会针对数组的元素进行评估p

如果循环正确,则需要包含一个等于空指针的元素,例如

char *p[6] ={"jack","is", "a","good","boy"};
       ^^^

或者

char *p[] = {"jack","is", "a","good","boy", NULL };
于 2021-05-25T10:27:00.317 回答
0

一元运算&符可以看作是一个指针运算符。

从第一个示例中,p是一个指针,char并且p1是一个指向 a 的指针的指针char。但是当你拥有它时,&p它就变成了一个指向 a 的指针,它char的类型与 .char **的类型相同p1

在第二个示例中,p是一个指针数组。并且作为所有数组,它可以衰减为指向其第一个元素的指针。因此,仅p单独使用与&p[0]. asp[0]是指向char(ie char *) 的指针,然后&p[0]是指向char(ie char **) 的指针。

因此,在第一个示例中,必须使用指向运算符来获取指向char. 在第二个示例中不需要这样做,因为隐式使用了指向运算符的指针。

于 2021-05-25T10:27:24.080 回答